У меня есть программа, которая захватывает изображение с помощью 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;
}
Я проверил и подтвердил, что он не возвращает ошибку. Все выполняется, и образ прекрасно доходит до сервера, просто не сжимается вообще. Я, вероятно, делаю кучу глупых ошибок, поэтому любая помощь приветствуется.
destLen
и просто возвращаете простой указатель на буфер без соответствующего размера. После завершенияcompress
он сохраняет фактический размер сжатых данных в буфере (вероятно, меньший, чем наихудший случай, заданныйcompressBound
). | Учитывая, что вы работаете на C++, было бы неплохо использовать что-то вродеstd::vector
вместо необработанных массивов. - person Dan Mašek   schedule 07.11.2019