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)的主要内容,如果未能解决你的问题,请参考以下文章