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

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

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

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

#include <wincodecsdk.h> // Use this for WIC Direct2D functions


void 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";
    }
}

person user1371532    schedule 16.10.2012    source источник
comment
Вы можете использовать GetLastError, чтобы получить точную информацию об ошибке.   -  person Aladdin    schedule 16.10.2012
comment
Когда CreateBitmapFromMemory возвращает значение hr = -2003292276, GetLastError() возвращает 0, преобразованное в HEX: 0x88982F8C, коды ошибок Direct2D начинаются с 0x889...., msdn.microsoft.com/en-us/library/windows/desktop/, но эта ошибка там не указан.   -  person user1371532    schedule 16.10.2012
comment
Ошибка E_INVALIDARG, но это не помогает, мы не знаем, как MS проверяет аргументы, но есть обходной путь: вы можете установить bitsPerPixel на 32, чтобы ваш код работал.   -  person zdd    schedule 16.10.2012
comment
BitsPerPixel задается в параметре CreateBitmapFromMemory( ,,GUID_WICPixelFormat24bppRGB,...), где-то еще его надо указывать?   -  person user1371532    schedule 16.10.2012
comment
Вы вычисляете шаг = _nWidth * 3, так как 24/8 = 3, попробуйте использовать 32-битный цвет, это _nWidth * (32/8) = _nWidth * 4.   -  person zdd    schedule 16.10.2012


Ответы (3)


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

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

person Roman R.    schedule 17.10.2012

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

person zdd    schedule 17.10.2012

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

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

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

person kalbr    schedule 25.10.2012