2012-02-14 27 views
1

GoogleStack Overflowで検索していますが、実際の例は見つかりません。HBitmapをビットマップに変換してアルファチャンネルを保存

HBitmapをManaged .NETビットマップに変換する必要がありますが、次のコードはアルファチャンネルを保持しません。

private static Bitmap GetBitmapFromHBitmap(IntPtr nativeHBitmap) 
    { 
     Bitmap bmp = Bitmap.FromHbitmap(nativeHBitmap); 
     return bmp; 
    } 

私は this answer in SOを見つけたが、それは私のために動作しません、例では、透明性を維持し、しかし、それはY軸での私のイメージを180度反転させ、さらに180度回します。どうしてか分かりません。

このother exampleが動作しているようですが、それはC++

誰かがメモリリークせずに、C#で、この作業を持っており、非常に重要なのですか?

ありがとうございます。


EDIT:@Hansアンパッサンからのコメントに関しては、私はそれはOS(のみVistaとWin7の)から、サムネイルやアイコンを取得するためのシェル呼び出します(HBITMAPを取得するには、次のコードを使用し

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); 
    } 
+1

あなたはこのHBITMAPから来たのより良い仕事記述を行う必要があります。これは、そうでなければそれほど驚くではありません、24bppのフォーマットがありますGDIはhaでないので一般的ですアルファベットとビットマップは上下逆に格納されます。 –

答えて

1

Preserving the alpha channel when converting imagesを見てみてください。それはそれはあなたのケースであると思われます。

+0

ありがとうございますが、これもC++コードです。C# –

+0

'public static Bitmap ConvertPixelByPixel(IPictureDisp ipd)'(ページの最下部にあります)はC#で書かれていますか? –

+0

いいえ、それはC++です: 'RGBQUAD * pBits =(RGBQUAD *)(void *)dibsection.dsBm.bmBits;' –

関連する問題