【问题标题】:Creating a Direct2D BitmapSource from a Win32 icon pointer从 Win32 图标指针创建 Direct2D BitmapSource
【发布时间】:2015-02-13 23:38:51
【问题描述】:

我在 C# 中创建了一个应用程序,它使用 user32.dll 从窗口句柄获取图标图像,如下所示:

[DllImport("user32.dll", EntryPoint = "GetClassLong")]
private static extern int GetClassLongPtr32(IntPtr hWnd, int nIndex);

public static IntPtr GetAppIcon(IntPtr hwnd)
{
    return WI.GetClassLongPtr32(hwnd, WI.ICON_SMALL);
}

我想从这个图标指针创建一个 BitmapSource。通常对于 WPF,我会使用

Imaging.CreateBitmapSourceFromHIcon(handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());

但由于我需要 BitmapSource 在 Direct2D 渲染目标中绘制它,所以我需要使用 DirectX 的 BitmapSource

Microsoft.WindowsAPICodePack.DirectX.WindowImagingComponent.BitmapSource

如何使用图标句柄创建这种 BitmapSource,或者我可以将一种 BitmapSource 类型转移到另一种?

【问题讨论】:

    标签: c# .net wpf directx direct2d


    【解决方案1】:

    ID2D1DeviceContext 有一个方法 CreateBitmapFromWicBitmap

    在它的帮助下,您可以创建一个ID2D1Bitmap。您唯一需要做的就是从您的HICON 创建一个IWICBitmap,然后创建一个IWICFormatConverter,这样您就可以保留Alpha 通道。您可以这样做(下面的 sn-p 是 delphi 的,但在 C# 中应该非常相似):

    procedure iconToD2D1Bitmap;
    var
      hIcon: HICON;
      wicBitmap: IWICBitmap;
      wicConverter: IWICFormatConverter;
      wicFactory: IWICImagingFactory;  
      bitmapProps: D2D1_BITMAP_PROPERTIES1;
      bitmap: ID2D1Bitmap1;
    begin
      // get a HICON
      hIcon := SendMessage(Handle, WM_GETICON, ICON_BIG, 0);
      try  
        // create wic imaging factory
        CoCreateInstance(CLSID_WICImagingFactory, nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IUnknown, wicFactory);
    
        wicFactory.CreateBitmapFromHICON(hIcon, wicBitmap);
        wicFactory.CreateFormatConverter(wicConverter);
    
        wicConverter.Initialize(wicBitmap, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, nil, 0, WICBitmapPaletteTypeMedianCut);
    
        bitmapProps.bitmapOptions := D2D1_BITMAP_OPTIONS_NONE;
        bitmapProps.pixelFormat.format := DXGI_FORMAT_B8G8R8A8_UNORM;
        bitmapProps.pixelFormat.alphaMode := D2D1_ALPHA_MODE_PREMULTIPLIED;
        bitmapProps.dpiX := 96;
        bitmapProps.dpiY := 96;
        bitmapProps.colorContext := nil;    
    
        // deviceContext should be a valid D2D1DeviceContext
        deviceContext.CreateBitmapFromWicBitmap(wicConverter, @bitmapProps, bitmap);
    
        // the bitmap variable contains your icon
    
      except
        //
      end;
    end;
    

    【讨论】:

    • 很遗憾,WindowsAPICodePack 提供的 ImagingFactory 不包含 CreateBitmapFromHICON 方法。我想我会尝试使用 SharpDX,因为它提供了您正在使用的方法。
    • 我不知道WindowsAPICodePack到底包含什么,但是CreateBitmapFromHICON是一个IWICImagingFactory接口方法,是Wincodec library的一部分
    • 我知道,但是如果不导入接口,我就无法访问此方法,因为它们不包含在 WindowsAPICodePack 中。无论如何,我接受了您的回答,因为这是正确的方法,并且您帮助我在 SharpDX 中找到了它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-04-23
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 2013-10-09
    • 1970-01-01
    • 2011-07-28
    相关资源
    最近更新 更多