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 需要一个可搜索的流的主要内容,如果未能解决你的问题,请参考以下文章

如何在 node.js 中搜索字符串的流?

带有 MSVC++ 的 exiflib

如何使用来自inheritedWidget 的流处理导航?

java使用itex读取pdf,并搜索关键字,为其盖章

如何从已排序的流中最好地构建持久二叉树

如何使用 C++ 中的流从文件末尾读取给定数量的行?