Загрузка растрового изображения из ресурса (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 ); }
Используйте метод IWICImagingFactory::CreateDecoderFromStream для создания IWICBitmapDecoder.
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, а затем используйте метод Initialize объекта IWICFormatConverter для выполнения преобразования.
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 , чтобы создать объект ID2D1Bitmap , который может быть нарисован целевым объектом отрисовки и использоваться с другими объектами 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; }
В этом примере опущен некоторый код.
Связанные темы