ExifLib 需要一个可搜索的流
Posted
技术标签:
【中文标题】ExifLib 需要一个可搜索的流【英文标题】:ExifLib requires a seekable stream 【发布时间】:2014-03-14 12:12:43 【问题描述】:在 Windows Phone 8 C# 中实例化 ExifReader 时出现错误。请在下面找到代码 sn-p。请做需要的人
错误:“ExifLib 需要可搜索的流”
byte[] imageBytes = (byte[])PhoneApplicationService.Current.State["ViewImage"];
MemoryStream ms = new MemoryStream(imageBytes,0,imageBytes.Length);
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.SetSource(ms);
try
ExifReader xif = new ExifReader(toStream(bitmapImage)); // Getting Error here
double gpsLat, gpsLng;
xif.GetTagValue<double>(ExifTags.GPSLatitude, out gpsLat);
xif.GetTagValue<double>(ExifTags.GPSLongitude, out gpsLng);
map.Center = new System.Device.Location.GeoCoordinate(gpsLat, gpsLng);
catch (Exception ex)
MessageBox.Show(ex.Message.ToString());
Stream toStream(BitmapImage img)
WriteableBitmap bmp = new WriteableBitmap((BitmapSource)img);
using (MemoryStream stream = new MemoryStream())
bmp.SaveJpeg(stream, bmp.PixelWidth, bmp.PixelHeight, 0, 100);
stream.Position = 0;
return stream;
【问题讨论】:
【参考方案1】:当CanSeek
被调用时,您的MemoryStream
返回false。这是因为您已将 MemoryStream
包装在 using
语句中,这意味着您正在返回一个已处置的对象。
您的 toStream
方法实际上应该如下所示:
Stream ToStream(BitmapImage img)
MemoryStream stream = new MemoryStream();
using (WriteableBitmap bmp = new WriteableBitmap((BitmapSource)img))
bmp.SaveJpeg(stream, bmp.PixelWidth, bmp.PixelHeight, 0, 100);
stream.Position = 0;
return stream;
【讨论】:
不用担心。再想一想,您实际上应该将bmp
放入using
语句中,但是,因为所有GDI+ 对象都使用非托管资源。我已编辑我的答案以显示此更改。以上是关于ExifLib 需要一个可搜索的流的主要内容,如果未能解决你的问题,请参考以下文章