Я искал в 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);
}
Вам нужно сделать лучшую работу, описывающую, где это HBITMAP пришли. Это, впрочем, не очень удивительно, форматы 24bpp являются так как GDI не га ndle alpha и растровые изображения хранятся в обратном порядке. –