C++ GDIPlus 位图锁定位结果 WrongState(8)

Posted

技术标签:

【中文标题】C++ GDIPlus 位图锁定位结果 WrongState(8)【英文标题】:C++ GDIPlus Bitmap lockbits results WrongState(8) 【发布时间】:2021-04-05 14:18:33 【问题描述】:

我正在尝试正确。两个 Bitmap* 对象之间的不同区域。当我通过 2 位图 * 它可以为第一帧运行 lockbits 但它不能为第二个位图执行。

 Rect GetRecDifference(Bitmap* currentFrame, Bitmap* previousFrame) 
if (previousFrame == NULL) 
    previousFrame = currentFrame;


else 
    return Rect(0, 0, 0, 0);


BitmapData* bd1 = new BitmapData;
Rect rect1(0, 0, currentFrame->GetWidth(), currentFrame->GetHeight());
currentFrame->LockBits(&rect1, ImageLockModeRead, PixelFormat32bppARGB, bd1);

BitmapData* bd2 = new BitmapData;
Rect rect2(0, 0, previousFrame->GetWidth(), previousFrame->GetHeight());
previousFrame->LockBits(&rect2, ImageLockModeRead, PixelFormat32bppARGB, bd2);

它可以运行第一个(bd1 *)加载状态正常,最后一个结果显示正常。但是当涉及到 bd2 时,它显示状态为 WrongState(8)。

这是因为我将当前指针复制到前一个指针吗?错误状态错误的原因是什么?我需要从内存中清除某些部分吗?

【问题讨论】:

为什么有两个指针指向同一个位图?你为什么要锁定同一个位图两次?我想这就是它不起作用的原因。 您好,我想让当前位图对照前一个位图检查它,完成后我将当前位图保存为前一个位图。嗯,你可能是对的。我会很快检查的。将当前帧复制到前一帧部分怎么样?我的意思是我该怎么做?只是以前 = 当前足够,或者我应该将图像克隆到以前的变量,因为如您所知,我必须在函数结束时删除当前图像。 previous = current 使两个指针指向同一个位图。 在每次迭代开始时 current = getNewCurrent(); 然后在每次迭代结束时使用先前和当前进行处理 delete previous; previous = current; 最后,一旦整个迭代完成,您仍然会留下一张以前的图像,所以最后一张delete previous; 【参考方案1】:

问题是你试图锁定同一张图片两次,这个

previousFrame = currentFrame;

表示你的两个指针都指向同一个图像。

相反,您需要一个同时在内存中保存两个图像的方案。类似于以下内容

Bitmap* current = NULL;
Bitmap* previous = NULL;
while (something)

    current = getNextImage(); // get the new image
    if (current && previous)
    
        // process current and previous images
        ...
    
    delete previous; // delete the previous image, not needed anymore
    previous = current; // save the current image as the previous

delete previous; // one image left over, delete it as well

不是唯一的方法,但希望你能明白。

【讨论】:

以上是关于C++ GDIPlus 位图锁定位结果 WrongState(8)的主要内容,如果未能解决你的问题,请参考以下文章

使用 GDIPlus (WIN32 C++) 显示存储为 alpha 资源的图标

使用 Gdiplus 在 Win32 中创建位图

Gdiplus::屏幕上的图像 (C++)

c++ gdi图像数组

为啥我的 Gdiplus::Bitmap 不能保存文件

C++ gdi::Bitmap 到内存中的 PNG 图像