使用 C++ 压缩内存中的位图
Compressing a bitmap in memory with 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;
}
我检查并确认它没有返回错误。一切都已执行,图像可以正常发送到服务器,只是根本没有压缩。我可能犯了一堆愚蠢的错误,因此我们将不胜感激。
图像数据的无损压缩通常不适合减小文件大小(尤其是照片,可能是简单的图标)。如果您想知道压缩是否真的有效,请尝试上传全黑图像并查看尺寸是否减小。如果您可以看到黑色图像的文件大小有所减少,但您正在使用的图像却没有,则您可能不得不考虑使用有损格式(例如 jpeg、png 等)。
我有一个程序使用 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 等)。