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

C++ 用C+压缩内存中的位图+;,c++,bitmap,compression,zlib,image-compression,C++,Bitmap,Compression,Zlib,Image Compression,我有一个程序,它使用BitBlt()获取图像,并存储在变量unsigned char*image中。理想情况下,在上传到我的服务器之前,我想压缩它,因为它有点大,没有压缩。我用zlib尝试了几种不同的方法,编写了自己的运行长度编码方法,还有更多的方法,但没有成功。我认为这是因为我对压缩没有很强的理解 我使用zlib搜索并找到了一些示例,但我的图像在尝试压缩后似乎保持不变。这是代码: unsigned char* compressBitmap(size_t inImgSize, unsigned

我有一个程序,它使用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等)。p> 对图像数据进行无损压缩通常不会减少文件大小(尤其是照片,可能是简单的图标)。如果你想知道压缩是否有效,试着上传一张全黑的图片,看看大小是否减小。如果您可以看到在黑色图像上文件大小的减少,但不是您正在使用的图像,则可能需要考虑使用有损格式(例如JPEG、PNG等)。p> 谢谢你的回复。我尝试了一个完全黑色的图像,但大小相同。我可以使用其他格式之一。我的问题是,我找不到一个图书馆,也找不到办法把所有的东西都保存在内存中。像boost这样的库似乎希望写入和/或读取文件。你有没有建议转换它,但直接将其粘贴在内存中?PNG是一种无损图像编解码器。它使用ZLib进行压缩。还有很多其他的是纯无损的,或者支持这种模式。谢谢你的回复。我尝试了一个完全黑色的图像,但大小相同。我可以使用其他格式之一。我的问题是,我找不到一个图书馆,也找不到办法把所有的东西都保存在内存中。像boost这样的库似乎希望写入和/或读取文件。你有没有建议转换它,但直接将其粘贴在内存中?PNG是一种无损图像编解码器。它使用ZLib进行压缩。还有许多其他的方法要么是完全无损的,要么支持这种模式。您似乎正在使用
destLen
,只返回一个指向缓冲区的普通指针,而没有相应的大小。
compress
完成后,它将压缩数据的实际大小保存在缓冲区中(可能小于
compressBound
给出的最坏情况)假设你在C++中,使用类似于<>代码> STD::vector < /C> >代替原始数组可能是个好主意。ZLIB也是一个合理的选择(毕竟,PNG是基于这个)的,但是既然你在处理一个图像,你最好直接使用一个图像编解码器,您似乎正在使用
destLen
,只返回一个指向缓冲区的普通指针,而没有相应的大小。
compress
完成后,它将压缩数据的实际大小保存在缓冲区中(可能小于
compressBound
给出的最坏情况)假设你在C++中,使用类似于<>代码> STD::vector < /C> >代替原始数组可能是个好主意。ZLIB也是一个合理的选择(毕竟,PNG是基于这个)的,但是既然你在处理一个图像,那么你最好直接使用图像编解码器,而不是试图重新发明轮子。