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";
}
}
Код ошибки 0x88982F8C WINCODEC_ERR_INSUFFICIENTBUFFER
а причина теперь очевидна?
Первый параметр — ширина, а вторая высота. У вас они в неправильном порядке. В общем, вы предоставляете неверные аргументы, приводящие к неправильному буферу
Вы уверены, что передали правильный pixelFormat для функции CreateBitmapFromMemory? Вы жестко запрограммировали его в GUID_WICPixelFormat24bppRGB, я думаю, что это основная причина, вы должны убедиться, что этот формат совпадает с форматом с исходным растровым изображением, из которого вы копируете данные. попробуйте использовать функцию GetPixelFormat, чтобы получить правильный формат вместо жесткого кода.
Существует верхний предел размеров изображений на графическом процессоре.
Вызовите GetMaximumBitmapSize для цели рендеринга.
http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&л = EN-US&K = K (GetMaximumBitmapSize); к (DevLang-С% 2B% 2B); к (TargetOS-Windows)&е = верно
То, что вы получите, это максимальное количество пикселей по вертикали или по горизонтали.
Для больших изображений вам нужно будет загрузить их в программную цель рендеринга, такую как цель рендеринга растрового изображения, а затем отрендерить то, что вы хотите от этого.