gpt4 book ai didi

c# - 从 Win32 图标指针创建 Direct2D BitmapSource

转载 作者:太空宇宙 更新时间:2023-11-03 10:36:34 25 4
gpt4 key购买 nike

我在 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 类型转换为另一种类型?

最佳答案

ID2D1DeviceContext 有一个方法 CreateBitmapFromWicBitmap

在它的帮助下,您可以创建一个 ID2D1Bitmap。您唯一需要做的就是从您的 HICON 创建一个 IWICBitmap,然后创建一个 IWICFormatConverter,这样您就可以保留 alpha channel 。您可以这样做(下面的代码片段是 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;

关于c# - 从 Win32 图标指针创建 Direct2D BitmapSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27491436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com