リソースからビットマップを読み込む方法 (Direct2D)
「 ファイルからビットマップを読み込む方法」で説明されているように、Direct2D では Windows イメージング コンポーネント (WIC) を使用してビットマップを読み込みます。 リソースからビットマップを読み込むには、WIC オブジェクトを使用してイメージを読み込み、Direct2D 互換の形式に変換します。次に、 CreateBitmapFromWicBitmap メソッドを使用して ID2D1Bitmap を作成します。
アプリケーション リソース定義ファイルで、リソースを定義します。 次の例では、"SampleImage" という名前のリソースを定義します。
// 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"
このリソースは、アプリケーションのビルド時にアプリケーションのリソース ファイルに追加されます。
アプリケーション リソース ファイルからイメージを読み込みます。
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; }
リソースをロックし、イメージのサイズを計算します。
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; }
IWICImagingFactory::CreateStream メソッドを使用して IWICStream オブジェクトを作成します。
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 ); }
IWICBitmapDecoder を作成するには、IWICImagingFactory::CreateDecoderFromStream メソッドを使用します。
if (SUCCEEDED(hr)) { // Create a decoder for the stream. hr = pIWICFactory->CreateDecoderFromStream( pStream, NULL, WICDecodeMetadataCacheOnLoad, &pDecoder ); }
イメージからフレームを取得し、 IWICBitmapFrameDecode オブジェクトに格納します。
if (SUCCEEDED(hr)) { // Create the initial frame. hr = pDecoder->GetFrame(0, &pSource); }
Direct2D でイメージを使用するには、その前に 32bppPBGRA ピクセル形式に変換する必要があります。 イメージ形式を変換するには、 IWICImagingFactory::CreateFormatConverter メソッドを使用して IWICFormatConverter オブジェクトを作成し、 IWICFormatConverter オブジェクトの Initialize メソッドを使用して変換を実行します。
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
);
- 最後に、 CreateBitmapFromWicBitmap メソッドを使用して、レンダリング ターゲットによって描画され、他の Direct2D オブジェクトと共に使用できる ID2D1Bitmap オブジェクトを作成します。
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; }
この例では、一部のコードが省略されています。
関連トピック