Laden einer Bitmap aus einer Datei
Direct2D verwendet die Windows Imaging Component (WIC) zum Laden von Bitmaps. Um eine Bitmap aus einer Datei zu laden, verwenden Sie zunächst WIC-Objekte, um das Bild zu laden und in ein Direct2D-kompatibles Format zu konvertieren, und verwenden Sie dann die CreateBitmapFromWicBitmap-Methode , um eine ID2D1Bitmap zu erstellen.
Erstellen Sie einen IWICBitmapDecoder mit der IWICImagingFactory::CreateDecoderFromFileName-Methode .
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 );
Rufen Sie einen Frame aus dem Bild ab, und speichern Sie den Frame in einem IWICBitmapFrameDecode-Objekt .
if (SUCCEEDED(hr)) { // Create the initial frame. hr = pDecoder->GetFrame(0, &pSource); }
Die Bitmap muss in ein Format konvertiert werden, das Direct2D verwenden kann. Konvertieren Sie daher das Pixelformat des Bilds in 32bppPBGRA. (Eine Liste der unterstützten Formate finden Sie unter Pixelformate und Alphamodi.). Rufen Sie die IWICImagingFactory::CreateFormatConverter-Methode auf, um ein IWICFormatConverter-Objekt zu erstellen, und rufen Sie dann die Initialize-Methode des IWICFormatConverter-Objekts auf, um die Konvertierung auszuführen.
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 );
Rufen Sie die CreateBitmapFromWicBitmap-Methode auf, um ein ID2D1Bitmap-Objekt zu erstellen, das von einem Renderziel gezeichnet und mit anderen Direct2D-Objekten verwendet werden kann.
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; }
Code wurde in diesem Beispiel weggelassen.
Zugehörige Themen