Загрузка растрового изображения из файла
Direct2D использует компонент образов Windows (WIC) для загрузки растровых изображений. Чтобы загрузить растровое изображение из файла, сначала используйте объекты WIC для загрузки изображения и преобразования его в формат, совместимый с Direct2D, а затем используйте метод CreateBitmapFromWicBitmap для создания ID2D1Bitmap.
Создайте IWICBitmapDecoder с помощью метода IWICImagingFactory::CreateDecoderFromFileName .
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 );
Извлеките кадр из изображения и сохраните его в объекте 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; }
Некоторый код был опущен в этом примере.
Связанные темы