我正在尝试获取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/