Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wie unter Laden einer Bitmap aus einer Datei beschrieben, verwendet Direct2D die Windows-Bildverarbeitungskomponente (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 ID2D1Bitmap zu erstellen.
Definieren Sie in der Anwendungsressourcendefinitionsdatei die 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 Bilds.
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 IWICBitmapDecoder zu 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); }Bevor 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. 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 schließlich 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 code weggelassen.
Zugehörige Themen