2012-02-14 2 views
1

Я искал в Google и Stack Overflow, и я не могу найти рабочий пример.Преобразование HBitmap в Bitmap сохранение альфа-канала

Мне нужно преобразовать HBitmap в управляемый .NET-растровый файл, но следующий код не сохраняет альфа-канал.

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

this answer in SO я нашел, но это не работает для меня, например, сохраняет прозрачность, однако он переворачивается мое изображение на 180º в оси Y, а также поворачивать его на 180 °. Я не знаю почему.

Это other example, кажется, работает, но C++

Кто-то эту работу в C#, и очень важно, без утечек памяти?

Заранее спасибо.


EDIT: Что касается комментария от @Hans Passant, я использую следующий код, чтобы получить HBitmap (это вызов оболочки, чтобы получить эскиз или значок с ОС (только 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); 
    } 
+1

Вам нужно сделать лучшую работу, описывающую, где это HBITMAP пришли. Это, впрочем, не очень удивительно, форматы 24bpp являются так как GDI не га ndle alpha и растровые изображения хранятся в обратном порядке. –

ответ

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;' –

Смежные вопросы