从CImage AtlImage获取缓冲区数组

时间:2017-06-12 12:08:13

标签: c++ bitmap mfc atl

我试图获取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中对其进行编码。 也许还有另一种方式......无论如何,我需要缩放图像。 谢谢你的帮助

1 个答案:

答案 0 :(得分:1)

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

你应该使用的是GetDIBits,这是你应该使用无论如何,因为GetBitmapBits在大约20世纪90年代中期随着32位的引入而变得过时视窗。

更一般地说,您的代码看起来像是由Java翻译的人编写的。您不需要new所有这些对象。只需使用自动分配在堆栈上创建它们。