目标:
我想将ImageBrush转换为byte[]。
为什么?:
因为我想打印出图像,但是除了像MessageBox这样的东西之外,我不能创建任何UI元素。所以我找到了一个在线工具,它接收一个字节数组并生成一个图像。
如何在C# (WPF)中做到这一点?
到目前为止我尝试过的:
我已经将ImageBrush转换为BitmapSource,如下所示:
BitmapSource src = (BitmapSource)imageBrush.ImageSource;并将BitmapSource转换为位图图像如下:
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放到一个字节数组中!我试过这样做:
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;
}问题/错误:
但是当编码器试图保存内存流时,它说帧已经被处理了.请参阅下面的错误消息:
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!
发布于 2017-07-21 12:50:29
错误不是设置BitmapCacheOption.OnLoad,当源流在EndInit之后立即关闭时,这是必要的:
bImg.BeginInit();
bImg.CacheOption = BitmapCacheOption.OnLoad;
bImg.StreamSource = memoryStream;
bImg.EndInit();
memoryStream.Close();但是,创建中间BitmapImage根本没有必要。代码应该如下所示:
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();
}
}https://stackoverflow.com/questions/45237724
复制相似问题