【问题标题】:What is the srcData for ID2D1Bitmap::CreateBitmapID2D1Bitmap::CreateBitmap 的 srcData 是什么
【发布时间】:2019-12-23 14:33:14
【问题描述】:

我需要为我在 Direct2D 中工作的光线投射器从像素数组创建位图。但是,我无法理解如何使用 CreateBitmap 函数。具体来说,我不确定srcData 参数应该是什么。我很确定/希望它是指向像素数组的指针,但我不确定如何设置该数组。它应该是什么样的数组?什么数据类型?等等。

这是我尝试过的:

    int width = 400, height = 400;
    D2D1::ColorF * arr = (D2D1::ColorF*)calloc(width * height * 4, sizeof(D2D1::ColorF));
    for (int i = 0; i < width * height * 4; i++) { arr[i] = D2D1::ColorF(0.0f, 1.0f, 0.0f); }
    // Create the bitmap and draw it on the screen
    ID2D1Bitmap * bmp;
    HRESULT hr;
    hr = renderTarget->CreateBitmap(
        D2D1::SizeU(width, height),
        arr,
        width * sizeof(int) * 4,
        D2D1::BitmapProperties(),
        &bmp);
    if (hr != S_OK) { return; } // I've tested and found that hr does not equal S_OK

    // Draw the bitmap...

第二行和第三行应该是什么样子?还有什么我做错了吗?

【问题讨论】:

    标签: c++ bitmap direct2d


    【解决方案1】:

    Syntax:

    HRESULT CreateBitmap(
      D2D1_SIZE_U                    size,
      const void                     *srcData,
      UINT32                         pitch,
      const D2D1_BITMAP_PROPERTIES & bitmapProperties,
      ID2D1Bitmap                    **bitmap
    );
    

    您的代码:

    hr = renderTarget->CreateBitmap(
        D2D1::SizeU(width, height),
        arr, // <<--- Wrong, see (a) below
        width * sizeof(int) * 4, // <<--- Close but wrong, see (b) below
        D2D1::BitmapProperties(), // <<--- Wrong, see (c) below
        &bmp);
    

    (a) - 你应该在这里提供一个像素数据数组,其中格式取决于位图的格式。请注意,这是可选的,您可以在不初始化的情况下创建位图。像素不完全是D2D1::ColorF。如果您请求相应的位图格式,它们可能是 4 字节 RGBA 数据,请参见下面的 (c)。

    (b) - 这是行之间的距离(以字节为单位),如果您的像素应该是 32 位值,您通常会在此处使用 Width * 4

    (c) - 这请求DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN 并导致位图创建错误。你需要一个真正的格式,比如DXGI_FORMAT_B8G8R8A8_UNORM(见Pixel FormatsSupported Pixel Formats and Alpha Modes

    上面的第一个链接显示了内存中的字节如何准确地映射到像素颜色,您应该分别准备数据。

    UPD

    使用DXGI_FORMAT_B8G8R8A8_UNORM,你的初始化结构是这样的:

    UINT8* Data = malloc(Height * Width * 4);
    for(UINT Y = 0; Y < Height; Y++)
      for(UINT X = 0; X < Width; X++)
      {
        UINT8* PixelData = Data + ((Y * Width) + X) * 4;
        PixelData[0] = unsigned integer blue in range 0..255;
        PixelData[1] = unsigned integer red in range 0..255;
        PixelData[2] = unsigned integer green in range 0..255;
        PixelData[3] = 255;
      }
    

    【讨论】:

    • 好的,谢谢。那么如果我使用DXGI_FORMAT_B8G8R8A8_UNORM,我的arr 应该是什么样子?只是int 还是什么?我是否使用十六进制或其他东西来表示每种颜色?你能举个例子吗?再次感谢。
    • 好的。我想我几乎明白了。首先,我必须在malloc 之前包含(UINT8*),因为malloc 返回了void*。我还必须在CreateBitmap 中的Data 之前添加(cost void*) 以使其成为正确的数据类型。我不确定我是否做对了。此外,它说第四个参数DXGI_FORMAT_B8G8R8_UNORM 的类型是DXGI_FORMAT,而不是const D2D1_BITMAP_PROPERTIES。抱歉,我花了这么长时间才得到这个:P 感谢您的帮助。
    • 感谢您的回答。我现在想通了。我需要D2D1::BitmapProperties( D2D1::PixelFormat( DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE ) ), 作为我的第四个参数。谢谢。
    猜你喜欢
    • 2015-08-13
    • 2014-09-08
    • 2021-04-14
    • 2014-07-21
    • 2017-06-13
    • 2023-03-07
    • 2014-04-18
    • 2014-07-24
    • 2014-11-05
    相关资源
    最近更新 更多