2016-12-27 33 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

라인 248 이후에 exampled @ https://github.com/lz4/lz4/blob/dev/examples/compress_functions.c를 점검 했습니까? 즉, maxcompsize – HRgiger

+0

의 사용은이 함수가 얻은 바이트 수를 반환했다고 생각했습니다. 압축 (original_size - compressed_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보다 큰 크기를 초래하는 경우, 함수는 실패 할 것이다. 그러나 그것이 왜 그것이 음수 값을 반환했는지 설명하지 못합니다 - 그것은 문서화되지 않았습니다. 그러나 압축 된 파일을 수용해야하는 경우 더 큰 버퍼를 제공하여 파일 크기를 늘릴 수 있어야합니다. op < dest이 코드를보고 있지만,이 방식을 볼 어려운 경우 음의 값을 반환

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

포인터 산술 다음 source code 보면

, 반환 값에 의해 LZ4_compress_generic() 생성됩니다 그럴 수 있습니다. 문제가되는 경우 (그리고 더 큰 대상 버퍼를 제공해도 문제가 해결되지 않는 경우) 디버거의 코드를 단계별로 실행하여 문제가 무엇인지 판단하는 것이 좋습니다.

+1

const size_t max_dst_size = LZ4_compressBound (src_size); 문제를 해결하다 –