C++ ID2D1Bitmap1::Map,何时可以使用它?

C++ ID2D1Bitmap1::Map,何时可以使用它?,c++,windows-8,direct2d,C++,Windows 8,Direct2d,因此,我最近通过并转换了一个我编写的简单测试应用程序,以使用新版本的Direct2D,这意味着我基本上复制了应用程序的相关部分。这是可行的,因为我的应用程序的行为和以前一样(只是画了一堆像素) 之前,为了更新位图,我执行了以下操作: for(int i = 0; i < 1000; ++i ) { int x = rand()%600; int y = rand()%600; int index = 4 * ( x + ( y * 600 ) ); imag

因此,我最近通过并转换了一个我编写的简单测试应用程序,以使用新版本的Direct2D,这意味着我基本上复制了应用程序的相关部分。这是可行的,因为我的应用程序的行为和以前一样(只是画了一堆像素)

之前,为了更新位图,我执行了以下操作:

for(int i = 0; i < 1000; ++i )
{
    int x = rand()%600;
    int y = rand()%600;
    int index = 4 * ( x + ( y * 600 ) );
    imageData[index] = rand()%256;
    imageData[index+2] = 0;
}

D2D1_RECT_U rect2 = RectU(0,0,600,600);
pBitmap->CopyFromMemory(&rect2, imageData, 600*4);
这仍然有效,但我认为,由于我在闪亮的新ID2D1Bitmap1接口上有了这个漂亮的映射方法,我可以摆脱CPU端阵列并执行以下操作:

D2D1_MAPPED_RECT* mapped = NULL;
ThrowIfFailed( pBitmap->Map( D2D1_MAP_OPTIONS_WRITE, mapped ) );

for(int i = 0; i < 1000; ++i)
{
    int x = rand()%600;
    int y = rand()%600;
    int index = 4 * ( x + ( y * 600 ) );
    mapped->bits[index] = rand()%256;
    mapped->bits[index+2] = 0;
}

ThrowIfFailed(pBitmap->Unmap());
D2D1_-MAPPED_-RECT*MAPPED=NULL;
ThrowIfFailed(pBitmap->Map(D2D1\u Map\u OPTIONS\u WRITE,mapped));
对于(int i=0;i<1000;++i)
{
int x=rand()%600;
int y=rand()%600;
整数指数=4*(x+(y*600));
映射->位[索引]=rand()%256;
映射->位[索引+2]=0;
}
ThrowIfFailed(pBitmap->Unmap());
每次调用E_INVALIDARG映射时,使用传递给CreateBitmap的D2D1_位图属性1中的各种组合以及调用映射时,此操作都失败

查看对的描述,似乎3个选项(读、写、放弃)中没有一个可以实际用于我使用Direct2D上下文创建的位图


在Direct2D中,如何获得可以映射、写入、取消映射和绘制的位图?

您的问题是映射指针不应该是空指针。我建议根据以下内容更改您的代码:

for(int i = 0; i < 1000; ++i )
{
    int x = rand()%600;
    int y = rand()%600;
    int index = 4 * ( x + ( y * 600 ) );
    imageData[index] = rand()%256;
    imageData[index+2] = 0;
}

D2D1_RECT_U rect2 = RectU(0,0,600,600);
pBitmap->CopyFromMemory(&rect2, imageData, 600*4);
D2D1_-MAPPED_-RECT-MAPPED


ThrowIfFailed(pBitmap->Map(D2D1\u Map\u OPTIONS\u WRITE,&Map))

最近我深入研究了这个问题,并面临着同样的问题。据我所知,D2D位图无法为CPU写入而锁定。更重要的是,您不能创建位图,既可以用D2D写入,也可以用CPU读取

我想用CPU和D2DAPI读写一些字节数组。但不幸的是,我必须使用两个使用不同
位图选项创建的位图。首先适用于D2DAPI,可以作为上下文的呈现目标

props.bitmapOptions = D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_TARGET;
第二个可以用CPU读取

props.bitmapOptions = D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_CPU_READ;
使用场景是“将原语渲染到第一个,使用
ID2D1Bitmap1::CopyFromBitmap
从第二个获取数据(使用map/unmap)”