位图源转换为位图图像

21

我需要解析Clipboard.GetImage()的内容(一个BitmapSource),转换为BitmapImage。 有人知道如何做吗?

2个回答

38

我找到了一个简洁的解决方案,它有效:

BitmapSource bitmapSource = Clipboard.GetImage();

JpegBitmapEncoder encoder = new JpegBitmapEncoder();
MemoryStream memoryStream = new MemoryStream();
BitmapImage bImg = new BitmapImage();

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

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

memoryStream.Close();

return bImg;

5
使用bImg.StreamSource = new MemoryStream(memoryStream.ToArray());而不是bImg.StreamSource = memoryStream;是否必要?同时移除memoryStream.Close();答案:是的,使用前者可以确保内存流的内容被正确地复制到新的内存流实例中,而后者则可能会引起异常或未定义行为。移除memoryStream.Close()也是安全的,因为它不会对内存流产生负面影响。 - Elmo
2
你应该在结尾处添加bImg.Freeze()以允许多线程调用,否则完美运行。 - m1k4
2
@不要忘了点赞:对我来说,bImg.StreamSource = new MemoryStream(memoryStream.ToArray()); 这句话是必要的,否则会抛出异常。 - dotNET
2
如果剪贴板中有一个PNG图像,那么应该使用PngBitmapEncoder吗? - Fabian Bigler
1
@Elmo,确实需要进行这些更改,否则它也会对我抛出异常。 - Amir Mahdi Nassiri
1
这是不是无损的? - EFraim

2
using System.IO; // namespace for  using MemoryStream

private static byte[] ReadImageMemory()
{
    BitmapSource bitmapSource = BitmapConversion.ToBitmapSource(Clipboard.GetImage());
    JpegBitmapEncoder encoder = new JpegBitmapEncoder();
    MemoryStream memoryStream = new MemoryStream();
    encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
    encoder.Save(memoryStream);
    return memoryStream.GetBuffer();
}

// and calling by this example........
byte[] buffer = ReadImageMemory();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接