我的最终目标是放置一个 HBitmap,我使用以下代码从 Windows 缩略图缓存中检索到它:
// GUID of IShellItem.
Guid uuid = new Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe");
SHCreateItemFromParsingName(filename, IntPtr.Zero, uuid, out ppsi);
((IShellItemImageFactory)ppsi).GetImage(new SIZE(72, 72), 0, out hbitmap);
成 JPEG 编码的流,然后我将通过网络发送。
我的第一次尝试是使用Image.FromHBitmap()
,但是这个忽略了 alpha 通道。请参阅此问题:
在 C# 中使用本机 HBitmap 同时保留 Alpha 通道/透明度
解决方案显然是创建一个使用本机位图数据的新位图。但是请查看汉斯对另一个问题的回答的评论:有些拇指会颠倒,有些则不会。是否有可能确定我是否必须轮换?(大卫的评论没有答案,我不能在那里发表评论......)我读了很多次,位图数据通常是倒置存储的,那么步幅值将是负数。我检查了NativeMethods.BITMAP
对象的所有字段,对于正常图像和倒置图像,它们都没有区别。所以必须有另一种解决方案。
还有另一个问题:当将位图保存到 JPEG 流时.Save(somestream, ImageFormat.Jpeg)
,透过图像透明部分的背景会变成白色,但我希望它是黑色的。
先感谢您!