You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过WinAPI/GDI+/DirectX加载带Alpha通道的PNG图片?

加载带Alpha通道PNG的简便方法

一、GDI+(最轻便,代码量最少)

GDI+原生支持PNG的Alpha通道,无需复杂配置,仅需少量代码即可完成加载和像素数据提取:

#include <gdiplus.h>
#pragma comment(lib, "gdiplus.lib")

using namespace Gdiplus;

// 初始化GDI+
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

// 加载PNG文件
Image* pngImage = Image::FromFile(L"test.png");
if (pngImage->GetLastStatus() == Ok) {
    Bitmap* bitmap = new Bitmap(pngImage);
    BitmapData bitmapData;
    Rect rect(0, 0, bitmap->GetWidth(), bitmap->GetHeight());
    
    // 提取32位ARGB格式像素数据(保留Alpha通道)
    bitmap->LockBits(&rect, ImageLockModeRead, PixelFormat32bppARGB, &bitmapData);
    // bitmapData.Scan0为像素数据指针,bitmapData.Stride为每行字节数
    bitmap->UnlockBits(&bitmapData);
    
    delete bitmap;
}
delete pngImage;

// 卸载GDI+
GdiplusShutdown(gdiplusToken);

只需链接gdiplus.lib,GDI+内部处理COM初始化,支持直接绘制到DC或提取像素数据。

二、Windows Imaging Component(WIC)简化版

WIC是系统自带的轻量图像组件,代码比DirectX原生解码流程简洁,适合直接操作像素数据的场景:

#include <wincodec.h>
#pragma comment(lib, "windowscodecs.lib")

// 初始化COM
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

IWICImagingFactory* pFactory = nullptr;
CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_IWICImagingFactory, reinterpret_cast<void**>(&pFactory));

// 创建解码器加载PNG
IWICBitmapDecoder* pDecoder = nullptr;
pFactory->CreateDecoderFromFilename(L"test.png", NULL, GENERIC_READ, WICDecodeMetadataCacheOnLoad, &pDecoder);

// 获取图像帧
IWICBitmapFrameDecode* pFrame = nullptr;
pDecoder->GetFrame(0, &pFrame);

// 转换为32位ARGB格式
IWICFormatConverter* pConverter = nullptr;
pFactory->CreateFormatConverter(&pConverter);
pConverter->Initialize(pFrame, GUID_WICPixelFormat32bppARGB, WICBitmapDitherTypeNone, NULL, 0.f, WICBitmapPaletteTypeCustom);

// 获取图像尺寸并提取像素数据
UINT width, height;
pConverter->GetSize(&width, &height);
BYTE* pPixels = new BYTE[width * height * 4];
pConverter->CopyPixels(NULL, width * 4, width * height * 4, pPixels);

// 释放资源
delete[] pPixels;
pConverter->Release();
pFrame->Release();
pDecoder->Release();
pFactory->Release();
CoUninitialize();

依赖系统自带组件,无需额外安装库,可直接获取带Alpha的ARGB像素数据。

三、DirectX 纹理简化加载(渲染场景)

若需将PNG加载为DirectX纹理,可使用微软官方DirectXTK库的封装函数,核心代码仅一行:

#include <DirectXTK/TextureLoader.h>

ID3D11ShaderResourceView* pSRV = nullptr;
HRESULT hr = CreateWICTextureFromFile(pD3DDevice, L"test.png", nullptr, &pSRV);
if (SUCCEEDED(hr)) {
    // 加载完成的纹理可直接用于渲染
}

DirectXTK仅需链接少量模块,体积增量极小,自动处理Alpha通道和纹理格式转换。

内容的提问来源于stack exchange,提问作者I101I

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 20:02:49