gpt4 book ai didi

c++ - 从 CImage AtlImage 获取缓冲区数组

转载 作者:行者123 更新时间:2023-11-28 05:06:54 25 4
gpt4 key购买 nike

我正在尝试获取 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 对其进行编码。也许还有其他方法......无论如何我需要缩放图像。感谢帮助

最佳答案

您不能使用 GetBitmapBits在属于 DIB 部分的图像上。它适用于设备相关位图 (DDB)。据推测,MFC 使用一个断言将您从这个错误中拯救出来,该断言在内部验证 CImage 对象不是 DIB 部分。

你应该使用的是 GetDIBits ,这是您应该无论如何使用的,因为 GetBitmapBits 大约在 1990 年代中期随着 32 位 Windows 的引入而过时。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com