将HBitmap转换为保留alpha通道的位图

时间:2012-02-14 11:03:19

标签: c# .net image bitmap hbitmap

我一直在GoogleStack Overflow中搜索,但我找不到一个有效的例子。

我需要将HBitmap转换为Managed .NET位图,但以下代码不会保留Alpha通道

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

我找到了this answer in SO,但它对我不起作用,该示例保留了透明度,但是它将我的图像在Y轴上翻转180º并将其旋转180º。我不知道为什么。

other example似乎有效,但它是C ++

有人在C#中工作,非常重要,没有内存泄漏吗?

提前致谢。


编辑:关于@Hans Passant的评论,我使用以下代码获取HBitmap(它是一个shell调用,用于从操作系统获取缩略图或图标(仅限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 个答案:

答案 0 :(得分:1)

请查看Preserving the alpha channel when converting images。看来这是你的情况。