私の最終的な目標は、次のコードを使用して Windows Thumbnail Cache から取得した HBitmap を配置することです。
// 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()
が、これはアルファチャンネルを無視します。この質問を参照してください:
Use native HBitmap in C# while preserving alpha channel/transparency
明らかに解決策は、ネイティブ ビットマップのデータを使用する新しいビットマップを作成することです。しかし、他の質問に対する Hans の回答のコメントを確認してください。回転する必要があるかどうかを判断する可能性はありますか? (Davidのコメントへの回答はなく、そこにコメントすることはできません...)ビットマップデータは上下逆に保存されるのが通常であり、ストライド値は負になることを何度も読みました。オブジェクトのすべてのフィールドをチェックしNativeMethods.BITMAP
ましたが、通常の画像と逆さまの画像で違いはありません。したがって、別の解決策があるはずです。
また、別の問題もあります。ビットマップを で JPEG ストリームに保存すると.Save(somestream, ImageFormat.Jpeg)
、画像の透明な部分を通して輝く背景が白くなりますが、黒にしたいのです。
前もって感謝します!