c++ - 使用 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 等)。
推荐阅读
- python - PANDAS:成功执行to_excel,但没有输出文件
- java - Java Bean Validation 2.0 Hibernate Validator - 带有外部 XML 配置的可执行 JAR
- r - 在 R 中找不到 TensorFlow 安装
- excel - 通过csv文件打开循环vba丢失数据
- openstack - openstack 和 OVH vRack 公共 IP 池配置
- botframework - 如何使用钩子向消息的 channelData 添加值
- gstreamer - 垫创建和 gst_parse_launch 上的一些错误
- delphi - 在哪里可以找到从 GetIt Manager 下载的样式
- unity3d - IL2CPP compiled UWP app using Windows System DLLs on ARM
- python - odoo 13 社区版,关于开始日期、结束日期、员工和商店的日期限制