如何从jpg Image的MemoryStream中获取Image类?

时间:2016-10-19 10:19:48

标签: wpf image bitmap

现在我正在尝试从jpg图像中获取图像类。 我已经尝试使用here链接的BitmapSource。

错误不是英文,但意思是"图像标题被破坏。所以,它是不​​可能解码的。"。 其他格式如gif,png,bmp都没有问题。 只有jpg格式才能解决这个问题。

<序列> Zip档案文件(jpg文件在此文件中。) - >解压缩库 - > MemoryStream(jpg文件) - > BitmapSource

imageSource.BeginInit();
imageSource.StreamSource = memoryStream;
imageSource.EndInit();

此代码出错。

我认为原因是内存流具有jpg的原始二进制,并且它不是Bitmap格式。因此,BitmapSource无法将此内存流数据识别为位图图像。

我该如何解决这个问题? 我的目标是输入:" ZIP文件(在jpg中)" - >输出:图像类。

谢谢!

<我的代码>

using (MemoryStream _reader = new MemoryStream())
{
    reader.WriteEntryTo(_reader);             // <- input jpg_data to _reader
    var bitmap = new BitmapImage();
    bitmap.BeginInit();
    bitmap.CacheOption = BitmapCacheOption.OnLoad;
    bitmap.StreamSource = _reader;
    bitmap.EndInit();
    bitmap.Freeze();

    Image tmpImg = new Image();
    tmpImg.Source = bitmap;
}

1 个答案:

答案 0 :(得分:0)

写完后回滚流。虽然显然只有JpegBitmapDecoder受到源流Position的影响,但通常应该对所有类型的位图流执行此操作。

var bitmap = new BitmapImage();

using (var stream = new MemoryStream())
{
    reader.WriteEntryTo(stream);
    stream.Position = 0; // here

    bitmap.BeginInit();
    bitmap.CacheOption = BitmapCacheOption.OnLoad;
    bitmap.StreamSource = stream;
    bitmap.EndInit();
    bitmap.Freeze();
}

var tmpImg = new Image { Source = bitmap };

如果您实际上并不关心您的图片来源是BitmapImage还是BitmapFrame,您可以将代码缩减为:

BitmapSource bitmap;

using (var stream = new MemoryStream())
{
    reader.WriteEntryTo(stream);
    stream.Position = 0;
    bitmap = BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
}

var tmpImg = new Image { Source = bitmap };