Сжатие растрового изображения в памяти с помощью C ++ - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть программа, которая захватывает изображение с помощью 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;
}

Я проверил и подтвердил, что ошибка не возвращается. Все выполняется, и изображение прекрасно подходит к серверу, просто не сжимается. Я, вероятно, делаю кучу глупых ошибок, поэтому любая помощь приветствуется.

1 Ответ

0 голосов
/ 07 ноября 2019

Сжатие без потерь данных изображения обычно не позволяет уменьшить размер файла (особенно фотографии, возможно, простые иконки). Если вы хотите узнать, действительно ли работает сжатие, попробуйте загрузить полностью черное изображение и посмотрите, уменьшится ли его размер. Если вы можете увидеть уменьшение размера файла на черном изображении, но не на тех изображениях, которые вы используете, вам, возможно, придется рассмотреть возможность использования формата с потерями (например, JPEG, PNG и т. Д.).

...