【发布时间】:2020-03-03 14:39:54
【问题描述】:
我有一个使用 BitBlt() 抓取图像并存储在变量 unsigned char* image 中的程序。理想情况下,在将其上传到我的服务器之前,我想对其进行压缩,因为未压缩它有点大。我用 zlib 尝试了几种不同的方法,编写了我自己的运行长度编码方法,还有更多但没有运气。我把它归咎于我没有强烈的理解压缩。
我搜索并找到了一些使用 zlib 的示例,但我的图像在尝试压缩后似乎保持不变。这是代码:
unsigned char* compressBitmap(size_t inImgSize, unsigned char* inImage)
{
uLongf srcLen = inImgSize;
uLongf destLen = compressBound(srcLen);
unsigned char* outImage = new unsigned char[destLen];
int res = compress((Bytef*)outImage, &destLen, (Bytef*)inImage, srcLen);
return outImage;
}
我检查并确认它没有返回错误。一切都已执行,并且图像可以很好地发送到服务器,只是根本没有压缩。我可能犯了一堆愚蠢的错误,因此感谢您的帮助。
【问题讨论】:
-
您似乎在输入
destLen,并且您只是返回一个指向缓冲区的普通指针,而没有相应的大小。在compress完成后,它保存缓冲区中压缩数据的实际 大小(可能小于compressBound给出的最坏情况)。 |鉴于您使用的是 C++,最好使用std::vector之类的东西而不是原始数组。 -
另外,ZLib 是一个合理的选择(毕竟 PNG 就是基于这个),但是既然你是在处理一个图像,你还不如直接使用图像编解码器,而不是尝试重新发明轮子。
标签: c++ bitmap compression zlib image-compression