2

CreateBitmapFromMemory は、 _nWidth644 以下の場合に正常に実行されます。 値がこの値を超える場合、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";
    }
}
4

3 に答える 3

3

エラー コードは0x88982F8CWINCODEC_ERR_INSUFFICIENTBUFFERで、その理由は明らかですか?

最初のパラメーターは widthで、2 番目のパラメーターは高さです。あなたはそれらを間違った順序で持っています。全体として、不適切な引数を指定すると、バッファが不良になります。

于 2012-10-17T11:36:32.840 に答える
0

GPU 上の画像のサイズには上限があります。

レンダー ターゲットで 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

返されるのは、垂直または水平の最大ピクセルです。大きな画像の場合は、ビットマップ レンダー ターゲットなどのソフトウェア レンダー ターゲットに画像を読み込んでから、必要なものをレンダリングする必要があります。

于 2012-10-25T10:46:24.290 に答える
0

関数 CreateBitmapFromMemory に正しい pixelFormat を渡しましたか? GUID_WICPixelFormat24bppRGB にハード コードします。これが根本的な原因だと思います。この形式が、データのコピー元のソース ビットマップの形式と同じであることを確認する必要があります。ハード コードではなく、GetPixelFormat 関数を使用して正しい形式を取得してみてください。

于 2012-10-17T11:30:50.993 に答える