Я искал в Google и Переполнение стека , и я не могу найти рабочий пример.
Мне нужно преобразовать HBitmap в Managed .NETрастровое изображение, но следующий код не сохраняет альфа-канал .
private static Bitmap GetBitmapFromHBitmap(IntPtr nativeHBitmap)
{
Bitmap bmp = Bitmap.FromHbitmap(nativeHBitmap);
return bmp;
}
Я нашел этот ответ в SO , но он не работает для меня,Пример сохраняет прозрачность, однако он переворачивает мое изображение на 180º по оси Y, а также поворачивает его на 180º.Я не знаю почему.
Этот другой пример , кажется, работает, но это 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);
}