如何通过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
相关产品推荐
相关产品推荐

