首页 > 解决方案 > 使用 C++ 压缩内存中的位图

问题描述

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

我检查并确认它没有返回错误。一切都已执行,图像可以很好地传送到服务器,只是根本没有压缩。我可能犯了一堆愚蠢的错误,因此感谢您的帮助。

标签: c++bitmapcompressionzlibimage-compression

解决方案


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


推荐阅读