【问题标题】:get buffer array from CImage AtlImage从 CImage AtlImage 获取缓冲区数组
【发布时间】:2017-11-13 21:46:03
【问题描述】:

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

【问题讨论】:

  • 您所说的“我收到异常isDibSection()”是什么意思?我没有看到您的代码中提到的那个名称的函数。异常发生在哪里?
  • 当我调用 GetPitch 时,此异常来自 atlimage.h
  • 为什么不使用 Save 方法提供使用 CreateStreamOnHGlobal 创建的 IStream

标签: c++ bitmap mfc atl


【解决方案1】:

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

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

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

【讨论】:

  • 如何在 CImage 中使用 GetDIBits??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 2020-10-06
  • 2013-06-24
  • 1970-01-01
相关资源
最近更新 更多