Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将ImageBrush转换为字节[]_C#_Wpf - Fatal编程技术网

C# 将ImageBrush转换为字节[]

C# 将ImageBrush转换为字节[],c#,wpf,C#,Wpf,目标: 我想将ImageBrush转换为字节[] 为什么?: 因为我想打印图像,但除了MessageBox之类的东西之外,我无法创建任何UI元素。所以我找到了一个在线工具,它接收字节数组并生成图像 我如何在C#(WPF)中实现这一点 到目前为止我所尝试的: 我已经将ImageBrush转换为位图源,如下所示: BitmapSource src = (BitmapSource)imageBrush.ImageSource; 并已将BitmapSource转换为位图图像,如下所示: private

目标:

我想将ImageBrush转换为字节[]

为什么?:

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

我如何在C#(WPF)中实现这一点

到目前为止我所尝试的:

我已经将ImageBrush转换为位图源,如下所示:

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;
    }
但就我个人而言,我无法将此位图图像转换为字节数组!我试过这个:

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

错误在于未设置
BitmapCacheOption.OnLoad
,这是在EndInit之后关闭源流时所必需的:

bImg.BeginInit();
bImg.CacheOption = BitmapCacheOption.OnLoad;
bImg.StreamSource = memoryStream;
bImg.EndInit();
memoryStream.Close();
但是,根本不需要创建中间位图图像。代码应该如下所示:

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();
    }
}