首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ImageBrush转换为byte[]

将ImageBrush转换为byte[]
EN

Stack Overflow用户
提问于 2017-07-21 12:29:01
回答 1查看 785关注 0票数 0

目标:

我想将ImageBrush转换为byte[]。

为什么?:

因为我想打印出图像,但是除了像MessageBox这样的东西之外,我不能创建任何UI元素。所以我找到了一个在线工具,它接收一个字节数组并生成一个图像。

如何在C# (WPF)中做到这一点?

到目前为止我尝试过的:

我已经将ImageBrush转换为BitmapSource,如下所示:

代码语言:javascript
复制
BitmapSource src = (BitmapSource)imageBrush.ImageSource;

并将BitmapSource转换为位图图像如下:

代码语言:javascript
复制
private BitmapImage BitmapSourceToBitmapImage(BitmapSource bmpSrc)
    {
        JpegBitmapEncoder encoder = new JpegBitmapEncoder();
        MemoryStream memoryStream = new MemoryStream();
        BitmapImage bImg = new BitmapImage();

        encoder.Frames.Add(BitmapFrame.Create(bmpSrc));
        encoder.Save(memoryStream);

        memoryStream.Position = 0;
        bImg.BeginInit();
        bImg.StreamSource = memoryStream;
        bImg.EndInit();

        memoryStream.Close();

        return bImg;
    }

但是为了我的生命,我不能把这个BitmapImage放到一个字节数组中!我试过这样做:

代码语言:javascript
复制
private byte[] BitmapImagetoByteArray(BitmapImage bitmapImage) {
        byte[] data;
        JpegBitmapEncoder encoder = new JpegBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(bitmapImage));
        using(MemoryStream ms = new MemoryStream())
        {
            encoder.Save(ms);
            data = ms.ToArray();
        }
        return data;
    }

问题/错误:

但是当编码器试图保存内存流时,它说帧已经被处理了.请参阅下面的错误消息:

代码语言:javascript
复制
    Void SaveFrame(System.Windows.Media.SafeMILHandle, System.Windows.Media.SafeMILHandle, System.Windows.Media.Imaging.BitmapFrame)
Cannot access a disposed object.
System.ObjectDisposedException: Cannot access a disposed object.
   at System.Windows.Media.Imaging.BitmapEncoder.SaveFrame(SafeMILHandle frameEncodeHandle, SafeMILHandle encoderOptions, BitmapFrame frame)
   at System.Windows.Media.Imaging.BitmapEncoder.Save(Stream stream)

有什么帮助吗?如何不创建UI元素就可以显示ImageBrush!

EN

回答 1

Stack Overflow用户

发布于 2017-07-21 12:50:29

错误不是设置BitmapCacheOption.OnLoad,当源流在EndInit之后立即关闭时,这是必要的:

代码语言:javascript
复制
bImg.BeginInit();
bImg.CacheOption = BitmapCacheOption.OnLoad;
bImg.StreamSource = memoryStream;
bImg.EndInit();
memoryStream.Close();

但是,创建中间BitmapImage根本没有必要。代码应该如下所示:

代码语言:javascript
复制
private byte[] BitmapSourceToByteArray(BitmapSource bmpSrc)
{
    var encoder = new JpegBitmapEncoder();
    encoder.QualityLevel = 100;
    encoder.Frames.Add(BitmapFrame.Create(bmpSrc));

    using (var stream = new MemoryStream())
    {
        encoder.Save(stream);
        return stream.ToArray();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45237724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档