【发布时间】:2018-04-23 16:19:46
【问题描述】:
我希望将剪贴板中的CF_DIBV5 格式转换为BitmapSource 对象。到目前为止,这是我的代码,基于我以前用于将普通 DIB 转换为 BitmapSource 的代码。要转换普通的 DIB,我发现我只需要获取标头,并将其添加到位图的原始字节之前。
不幸的是,当我尝试使代码兼容 DIBV5 时,程序现在抛出以下异常。
找不到适合完成此操作的成像组件。
当我使用BitmapFrame 的Create 方法时会发生这种情况。完整代码如下。
var infoHeader =
ApiHelper.ByteArrayToStructure<BITMAPV5HEADER>(buffer);
var fileHeaderSize = Marshal.SizeOf(typeof(BITMAPV5HEADER));
var infoHeaderSize = infoHeader.bV5Size;
var fileSize = fileHeaderSize + infoHeader.bV5Size + infoHeader.bV5SizeImage;
var fileHeader = new BITMAPV5HEADER();
fileHeader.bV5CSType = BITMAPV5HEADER.LCS_sRGB;
fileHeader.bV5Size = (uint) fileSize;
fileHeader.bV5Reserved = 0;
byte[] fileHeaderBytes =
ApiHelper.StructureToByteArray(fileHeader);
var bitmapStream = new MemoryStream();
bitmapStream.Write(fileHeaderBytes, 0, fileHeaderSize);
bitmapStream.Write(buffer, 0, buffer.Length);
bitmapStream.Seek(0, SeekOrigin.Begin);
BitmapFrame bitmap = BitmapFrame.Create(bitmapStream);
关于我做错了什么,或者我做错了什么的任何想法?我在盲目地摸索,不幸的是,对于像我这样的 C# 程序员来说,文档很少。我懂一点 C++,但不足以从 C++ 转换为 C#。
【问题讨论】:
-
异常不存在。 v5 格式的本意是对 BMP 格式的改进,但没有人想要它。甚至微软也不行。目前尚不清楚为什么这是一个问题,大多数提供 CF_DIBV5 剪贴板格式的程序如果想要可用,也会暴露 CF_BITMAP 和/或 CF_DIB。
-
在解释“缺少什么/无法使用上述代码”方面没有帮助,但从长远来看,this SO question 的这些答案中的任何一个都有可能以某种方式或可能被调整根据您的情况填写缺失的部分?
-
你能试试那个代码吗:pastebin.com/8Q1b7Bmh 我对 alpha 通道(透明度)有疑问,我不明白,但它可能对你来说已经足够了。它应该适用于 Windows 8+
标签: c#