Chargement d’une image bitmap à partir d’un fichier
Direct2D utilise le composant WIC (Windows Imaging Component) pour charger les bitmaps. Pour charger une image bitmap à partir d’un fichier, utilisez d’abord les objets WIC pour charger l’image et la convertir en un format compatible Direct2D, puis utilisez la méthode CreateBitmapFromWicBitmap pour créer un ID2D1Bitmap.
Créez une IWICBitmapDecoder à l’aide de la méthode IWICImagingFactory :: CreateDecoderFromFileName .
HRESULT DemoApp::LoadBitmapFromFile( ID2D1RenderTarget *pRenderTarget, IWICImagingFactory *pIWICFactory, PCWSTR uri, UINT destinationWidth, UINT destinationHeight, ID2D1Bitmap **ppBitmap ) { IWICBitmapDecoder *pDecoder = NULL; IWICBitmapFrameDecode *pSource = NULL; IWICStream *pStream = NULL; IWICFormatConverter *pConverter = NULL; IWICBitmapScaler *pScaler = NULL; HRESULT hr = pIWICFactory->CreateDecoderFromFilename( uri, NULL, GENERIC_READ, WICDecodeMetadataCacheOnLoad, &pDecoder );Récupérez un frame à partir de l’image et stockez le frame dans un objet IWICBitmapFrameDecode .
if (SUCCEEDED(hr)) { // Create the initial frame. hr = pDecoder->GetFrame(0, &pSource); }La bitmap doit être convertie dans un format que Direct2D peut utiliser, ce qui permet de convertir le format de pixel de l’image en 32bppPBGRA. (Pour obtenir la liste des formats pris en charge, consultez formats de pixel et modes alpha.) Appelez la méthode IWICImagingFactory :: CreateFormatConverter pour créer un objet IWICFormatConverter , puis appelez la méthode Initialize de l’objet IWICFormatConverter pour effectuer la conversion.
if (SUCCEEDED(hr)) { // Convert the image format to 32bppPBGRA // (DXGI_FORMAT_B8G8R8A8_UNORM + D2D1_ALPHA_MODE_PREMULTIPLIED). hr = pIWICFactory->CreateFormatConverter(&pConverter); } if (SUCCEEDED(hr)) { hr = pConverter->Initialize( pSource, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, NULL, 0.f, WICBitmapPaletteTypeMedianCut );Appelez la méthode CreateBitmapFromWicBitmap pour créer un objet ID2D1Bitmap qui peut être dessiné par une cible de rendu et utilisé avec d’autres objets Direct2D.
if (SUCCEEDED(hr)) { // Create a Direct2D bitmap from the WIC bitmap. hr = pRenderTarget->CreateBitmapFromWicBitmap( pConverter, NULL, ppBitmap ); } SafeRelease(&pDecoder); SafeRelease(&pSource); SafeRelease(&pStream); SafeRelease(&pConverter); SafeRelease(&pScaler); return hr; }
Du code a été omis dans cet exemple.