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

C# 将HBitmap转换为保留位图的alpha通道,c#,.net,image,bitmap,hbitmap,C#,.net,Image,Bitmap,Hbitmap,我一直在和中搜索,但找不到有效的示例 我需要将HBitmap转换为托管的.NET位图,但以下代码不保留alpha通道 private static Bitmap GetBitmapFromHBitmap(IntPtr nativeHBitmap) { Bitmap bmp = Bitmap.FromHbitmap(nativeHBitmap); return bmp; } 我发现,但它不适用于我,示例保留了透明度,但它将我的图像在Y轴上翻

我一直在和中搜索,但找不到有效的示例

我需要将HBitmap转换为托管的.NET位图,但以下代码不保留alpha通道

    private static Bitmap GetBitmapFromHBitmap(IntPtr nativeHBitmap)
    {
        Bitmap bmp = Bitmap.FromHbitmap(nativeHBitmap);
        return bmp;
    }
我发现,但它不适用于我,示例保留了透明度,但它将我的图像在Y轴上翻转180º,并将其旋转180º。我不知道为什么

这似乎有效,但它是C++

有人用C#工作,非常重要,没有内存泄漏

提前谢谢


编辑:关于@Hans Passant的评论,我使用以下代码获取HBitmap(这是一个shell调用,用于从操作系统(仅Vista和Win7)获取缩略图或图标)


您需要更好地描述这个HBITMAP的来源。否则也就不足为奇了,24bpp格式很常见,因为GDI不处理alpha,位图是颠倒存储的。
    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);
    }