我正在尝试获取AtlImage的字节缓冲区。类型为CImage此代码将仅缩放从路径szFilePath加载的图像
这里是 :

int iNewWidth = 60;
int iNewHeight = 60;

CImage image;
image.Load(szFilePath);

CDC *screenDC = GetDC();
CDC *pMDC = new CDC;
pMDC->CreateCompatibleDC(screenDC);

CBitmap *pb = new CBitmap;
pb->CreateCompatibleBitmap(screenDC, iNewWidth, iNewHeight);

CBitmap *pob = pMDC->SelectObject(pb);
image.StretchBlt(pMDC->m_hDC, 0, 0, iNewWidth, iNewHeight, 0, 0, image.GetWidth(), image.GetHeight(), SRCCOPY);
pMDC->SelectObject(pob);

CImage new_image;
new_image.Attach((HBITMAP)(*pb));

int bytesnbr = abs(new_image.GetPitch()) * new_image.GetHeight();
mSize = bytesnbr;
mBuffer = new BYTE[bytesnbr];
DWORD dwValue = pob->GetBitmapBits(bytesnbr, mBuffer);

new_image.Detach();
ReleaseDC(screenDC);

我收到异常isDibSection()我想获得缓冲区以在base64中对其进行编码。
也许还有其他方法...无论如何,我需要缩放图像。
感谢帮助

最佳答案

您不能在属于DIB部分的图像上使用 GetBitmapBits 。它仅适用于与设备有关的位图(DDB)。据推测,MFC通过断言在内部验证CImage对象不是DIB部分,从而使您免于此错误。

您应该使用的是 GetDIBits ,无论如何都应该使用它,因为GetBitmapBits在1990年代中期因引入32位Windows而过时。

一般而言,您的代码看起来像是由Java转换的人编写的。您不需要对所有这些对象进行new。只需使用自动分配在堆栈上创建它们。

关于c++ - 从CImage AtlImage获取缓冲区数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44499050/

10-11 00:44