用C++压缩内存中的位图

Compressing a bitmap in memory with C++

本文关键字:位图 内存 C++ 压缩      更新时间:2023-10-16

我有一个程序,它使用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;
}

我检查并确认它没有返回错误。所有的东西都被执行了,图像可以很好地到达服务器,只是根本没有被压缩。我可能犯了一堆愚蠢的错误,所以任何帮助都很感激。

图像数据的无损压缩通常不适合减少文件大小(尤其是照片,可能是简单的图标(。如果你想知道压缩是否真的有效,试着上传一张全黑的图像,看看大小是否缩小。如果你可以在黑色图像上看到文件大小的减小,但没有看到你正在使用的图像,你可能不得不考虑使用有损格式(例如jpeg、png等(。