Конвертировать HBitmap в Bitmap, сохраняя альфа-канал - PullRequest
1 голос
/ 14 февраля 2012

Я искал в 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);
    }

1 Ответ

1 голос
/ 14 февраля 2012

Пожалуйста, посмотрите на Сохранение альфа-канала при конвертации изображений . Похоже, это ваш случай.

...