WIC Direct2D CreateBitmapFromMemory: ограничения по ширине и высоте?

CreateBitmapFromMemory успешно выполняется, когда _nWidth является равно или меньше 644.
Если значение превышает это значение, значение HRESULT -2003292276

Существуют ли ограничения на ширину и высоту?

#include <d2d1.h>
#include <d2d1helper.h>

#include <wincodecsdk.h> // Use this for WIC Direct2D functionsvoid test()
{
IWICImagingFactory     *m_pIWICFactory;
ID2D1Factory           *m_pD2DFactory;
IWICBitmap             *m_pEmbeddedBitmap;
ID2D1Bitmap            *m_pD2DBitmap;

unsigned char *pImageBuffer = new unsigned char[1024*1024];

HRESULT hr = S_OK;

int _nHeight = 300;
int _nWidth =  644;

Если nWidth превышает 644, CreateBitmapFromMemory возвращает ошибку.

    //_nWidth =  648;if (m_pIWICFactory == 0 )
{
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);

// Create WIC factory
hr = CoCreateInstance(
CLSID_WICImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&m_pIWICFactory)
);

if (SUCCEEDED(hr))
{
// Create D2D factory
hr = D2D1CreateFactory( D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pD2DFactory );
}
}

hr = m_pIWICFactory->CreateBitmapFromMemory(
_nHeight,   // height
_nWidth,  // width
GUID_WICPixelFormat24bppRGB, // pixel format of the NEW bitmap
_nWidth*3,  // calculated from width and bpp information
1024*1024, // height x width
pImageBuffer, // name of the .c array
&m_pEmbeddedBitmap  // pointer to pointer to whatever an IWICBitmap is.
);

if (!SUCCEEDED(hr)) {
char *buffer = "Error in CreateBitmapFromMemory\n";
}
}

2

Решение

Код ошибки 0x88982F8C WINCODEC_ERR_INSUFFICIENTBUFFER а причина теперь очевидна?

Первый параметр — ширина, а вторая высота. У вас они в неправильном порядке. В общем, вы предоставляете неверные аргументы, приводящие к неправильному буферу

3

Другие решения

Вы уверены, что передали правильный pixelFormat для функции CreateBitmapFromMemory? Вы жестко запрограммировали его в GUID_WICPixelFormat24bppRGB, я думаю, что это основная причина, вы должны убедиться, что этот формат совпадает с форматом с исходным растровым изображением, из которого вы копируете данные. попробуйте использовать функцию GetPixelFormat, чтобы получить правильный формат вместо жесткого кода.

0

Существует верхний предел размеров изображений на графическом процессоре.

Вызовите GetMaximumBitmapSize для цели рендеринга.
http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&л = EN-US&K = K (GetMaximumBitmapSize); к (DevLang-С% 2B% 2B); к (TargetOS-Windows)&е = верно

То, что вы получите, это максимальное количество пикселей по вертикали или по горизонтали.
Для больших изображений вам нужно будет загрузить их в программную цель рендеринга, такую ​​как цель рендеринга растрового изображения, а затем отрендерить то, что вы хотите от этого.

0
По вопросам рекламы [email protected]