GoogleとStack Overflowで検索していますが、実際の例が見つかりません。
HBitmap を Managed .NET ビットマップに変換する必要がありますが、次のコードではアルファ チャネルが保持されません。
private static Bitmap GetBitmapFromHBitmap(IntPtr nativeHBitmap)
{
Bitmap bmp = Bitmap.FromHbitmap(nativeHBitmap);
return bmp;
}
SO でこの回答を見つけましたが、うまくいきません。例では透明度を保持していますが、画像を Y 軸で 180 度反転させ、180 度回転させます。どうしてか分かりません。
この他の例は機能しているように見えますが、C++ です
誰かがこれを C# で動作させており、メモリ リークなしで非常に重要ですか?
前もって感謝します。
編集: @Hans Passant からのコメントについては、次のコードを使用して HBitmap を取得します (OS からサムネイルまたはアイコンを取得するためのシェル呼び出しです (Vista と Win7 のみ)。
private static IntPtr GetHBitmap(string fileName, int width, int height, ThumbnailOptions options)
{
IShellItem nativeShellItem;
Guid shellItem2Guid = new Guid(IShellItem2Guid);
int retCode = SHCreateItemFromParsingName(fileName, IntPtr.Zero, ref shellItem2Guid, out nativeShellItem);
NativeSize nativeSize = new NativeSize();
nativeSize.Width = width;
nativeSize.Height = height;
IntPtr hBitmap;
HResult hr = ((IShellItemImageFactory)nativeShellItem).GetImage(nativeSize, options, out hBitmap);
Marshal.ReleaseComObject(nativeShellItem);
if (hr == HResult.Ok) return hBitmap;
throw Marshal.GetExceptionForHR((int) hr);
}