2016-12-27 6 views
1

Я использую LZ4 compressor C lib. Некоторые из файлов, которые я сжимаю, это JPG и PNG. По какой-то причине, которую я не в состоянии понять, методLZ4: сжатие сжатых форматов изображений

int compressedSize = LZ4_compress_default((char*)data, 
      compressedData, uncompressedSize, uncompressedSize); 

Иногда возвращает отрицательные значения для изображений (или ноль), которые я сжимающие.

Например, я сжимаю два стандартных изображения JPG. Один возвращается со значением «-236», а второй возвращает штраф за количество сжатых байтов, что означает, что первый не смог сжать. Возврат нулевого значения LZ4 не удалось сжать. Я понятия не имею, что значит -236. Это потому, что исходные данные уже сжаты до некоторой степени?

+4

Я бы предположил, что сжатая версия на самом деле была больше оригинала (что не редкость с JPEG, попробуйте закрепить jpeg-изображение и увидеть результаты для себя) и, следовательно, отрицательное число. – kuruczgyurci

+0

Вы проверили на экзамене @ https://github.com/lz4/lz4/blob/dev/examples/compress_functions.c после строки 248. ie использование maxcompsize – HRgiger

+0

Я думал, что функция вернула количество байтов, которые были получены с помощью сжатие (original_size - compress_size), но похоже, что я ошибался. В руководстве lz4 говорится о возвращаемом значении: _return: количество байтов, записанных в буфер «dest» (обязательно <= maxOutputSize) или 0, если сжатие сбой_. Он, кажется, не упоминает отрицательные значения. – kuruczgyurci

ответ

4

Функция возврата определение:

return : the number of bytes written into buffer 'dest' (necessarily <= maxOutputSize) 
      or 0 if compression fails 

Если сжатие привело к размеру больше, чем uncompressedSize, что весьма вероятно, с уже сжатого файла, функция не будет выполнена. Однако это не объясняет, почему оно вернуло отрицательное значение - это не документировано. Но остается, что если вам нужно разместить сжатые файлы, вам нужно будет увеличить размер файла, предоставив больший буфер.

Глядя на source code, возвращаемое значение генерируется в LZ4_compress_generic() по:

return (int) (((char*)op)-dest); 

указатель арифметика будет возвращать отрицательное значение, если op < dest, хотя, глядя на код, это трудно понять, как это может произойти. Если это вызывает беспокойство (и, конечно, если просто предоставление большего буфера назначения не устраняет проблему), я предлагаю вам выполнить код в своем отладчике, чтобы определить, в чем проблема.

+1

const size_t max_dst_size = LZ4_compressBound (src_size); решает проблему –

Смежные вопросы