Laden einer Bitmap aus einer Ressource (Direct2D)
Wie unter Laden einer Bitmap aus einer Dateibeschrieben, verwendet Direct2D die Windows Imaging Component (WIC), um Bitmaps zu laden. Um eine Bitmap aus einer Ressource zu laden, verwenden Sie WIC-Objekte, um das Bild zu laden und in ein Direct2D-kompatibles Format zu konvertieren. Verwenden Sie dann die CreateBitmapFromWicBitmap-Methode, um eine ID2D1Bitmapzu erstellen.
Definieren Sie in der Anwendungsressourcendefinitionsdateidie Ressource. Im folgenden Beispiel wird eine Ressource mit dem Namen "SampleImage" definiert.
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A // PARTICULAR PURPOSE. // // Copyright (c) Microsoft Corporation. All rights reserved #include "windows.h" SampleImage Image "sampleImage.jpg"
Diese Ressource wird der Ressourcendatei der Anwendung hinzugefügt, wenn die Anwendung erstellt wird.
Laden Sie das Image aus der Anwendungsressourcendatei.
HRESULT DemoApp::LoadResourceBitmap( ID2D1RenderTarget *pRenderTarget, IWICImagingFactory *pIWICFactory, PCWSTR resourceName, PCWSTR resourceType, UINT destinationWidth, UINT destinationHeight, ID2D1Bitmap **ppBitmap ) { IWICBitmapDecoder *pDecoder = NULL; IWICBitmapFrameDecode *pSource = NULL; IWICStream *pStream = NULL; IWICFormatConverter *pConverter = NULL; IWICBitmapScaler *pScaler = NULL; HRSRC imageResHandle = NULL; HGLOBAL imageResDataHandle = NULL; void *pImageFile = NULL; DWORD imageFileSize = 0; // Locate the resource. imageResHandle = FindResourceW(HINST_THISCOMPONENT, resourceName, resourceType); HRESULT hr = imageResHandle ? S_OK : E_FAIL; if (SUCCEEDED(hr)) { // Load the resource. imageResDataHandle = LoadResource(HINST_THISCOMPONENT, imageResHandle); hr = imageResDataHandle ? S_OK : E_FAIL; }Sperren Sie die Ressource, und berechnen Sie die Größe des Images.
if (SUCCEEDED(hr)) { // Lock it to get a system memory pointer. pImageFile = LockResource(imageResDataHandle); hr = pImageFile ? S_OK : E_FAIL; } if (SUCCEEDED(hr)) { // Calculate the size. imageFileSize = SizeofResource(HINST_THISCOMPONENT, imageResHandle); hr = imageFileSize ? S_OK : E_FAIL; }Verwenden Sie die IWICImagingFactory::CreateStream-Methode, um ein IWICStream-Objekt zu erstellen.
if (SUCCEEDED(hr)) { // Create a WIC stream to map onto the memory. hr = pIWICFactory->CreateStream(&pStream); } if (SUCCEEDED(hr)) { // Initialize the stream with the memory pointer and size. hr = pStream->InitializeFromMemory( reinterpret_cast<BYTE*>(pImageFile), imageFileSize ); }Verwenden Sie die IWICImagingFactory::CreateDecoderFromStream-Methode, um einen IWICBitmapDecoderzu erstellen.
if (SUCCEEDED(hr)) { // Create a decoder for the stream. hr = pIWICFactory->CreateDecoderFromStream( pStream, NULL, WICDecodeMetadataCacheOnLoad, &pDecoder ); }Rufen Sie einen Frame aus dem Bild ab, und speichern Sie ihn in einem IWICBitmapFrameDecode-Objekt.
if (SUCCEEDED(hr)) { // Create the initial frame. hr = pDecoder->GetFrame(0, &pSource); }Damit Direct2D das Bild verwenden kann, muss es in das Pixelformat 32bppPBGRA konvertiert werden. Verwenden Sie zum Konvertieren des Bildformats die IWICImagingFactory::CreateFormatConverter-Methode, um ein IWICFormatConverter-Objekt zu erstellen, und verwenden Sie dann die Initialize-Methode des IWICFormatConverter-Objekts, um die Konvertierung durchzufü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
);
- Verwenden Sie abschließend die CreateBitmapFromWicBitmap-Methode, 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; }
In diesem Beispiel wurde ein Teil des Codes ausgelassen.