我试图获取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中对其进行编码。
也许还有另一种方式......无论如何,我需要缩放图像。
谢谢你的帮助
答案 0 :(得分:1)
您无法在DIB部分的图像上使用GetBitmapBits
。它仅使用 与设备相关的位图(DDB)。据推测,MFC通过断言在内部验证CImage
对象不是DIB部分,从而使您免于此错误。
你应该使用的是GetDIBits
,这是你应该使用无论如何,因为GetBitmapBits
在大约20世纪90年代中期随着32位的引入而变得过时视窗。
更一般地说,您的代码看起来像是由Java翻译的人编写的。您不需要new
所有这些对象。只需使用自动分配在堆栈上创建它们。