상세 컨텐츠

본문 제목

ZLIB 로 메모리에 압축 하기

멀티미디어/압축(Compress)

by cepiloth 2021. 1. 6. 11:24

본문

728x90
반응형

ZLib 을 이용해서 메모리의 데이터 버퍼를 압축하고 압축한 메모리 데이터를 파일로 저장한다.
ZLib 은 메모리속 버퍼에서 버퍼로 압축하는 두개의 다른 함수를 제공
 
zlib.h 아래 함수 가 존재함.
dest -  압축된 데이터가 저장될 대상 버퍼의 포인터
destLen - 함수가 리턴된 후 이 값은 대상 버퍼의 사이즈가 리턴될것이다.
source -  압축할 원본 버퍼의 포인터
sourceLen - 원본소스의 크기
한쪽엔 소스 데이터의 포인터를 , 한쪽엔 압축데이터를 위한 빈 포인터 사용
압축 설정을 좀더 변경 하고 싶다면 아래 함수 사용.
파라미터는 compress 하나만 빼고  함수와 동일하나 level 값은 데이터 압축 레벨(성능)
Z_NO_COMPRESSION - 압축 안함
Z_BEST_SPEED - 빠른 압축 시간을 위한 경우
Z_BEST_COMPRESSION - 최고의 압축률을 원할 경우
Z_DEFAULT_COMPRESSION - 압축시간과 압축률사이의 중간값
이 두개의 함수는 성공하면 Z_OK 를 리턴한다. 실패시엔 좀더 자세한 정보가 들어있는 에러코드가 리턴된다.

int ZEXPORT compress(Bytef* dest,  
                            uLongf *destLen,  
                            const Bytef *source,  
                            uLong SourceLen); 
  
int ZEXPORT compress2(Bytef *dest,  
                            uLongf *destLen,  
                            const Bytef *source,  
                            uLong SourceLen,  
                            int level);

 

전체 소스

 
int main() {
 
    FILE *FileIn = fopen("FileIn.bmp", "rb");
    FILE *FileOut = fopen("FileOut.dat", "wb");
 
    //입력 파일의 사이즈를 구한다.
    fseek(FileIn, 0, SEEK_END);
    unsigned long FileInSize = ftell(FileIn);
 
    // raw 데이터와 압축 데이터의 버퍼를 생성한다.
    void *RawDataBuff = malloc(FileInSize);
    void *CompDataBuff = NULL;
 
    // zlib 에서는zlib 데이터스트림의 오버헤드를 막기위해 압축 버퍼 사이즈는 최소 원본 버퍼 + 12 바이트보다 0.1 배는 커야한다고 밝힌다.
   // ( 밑에 밑줄은 source -> dest 가 오타가 아닌지 의심)
    //원본 : zlib states that the source buffer must be at least 0.1times larger than the source buffer plus 12 bytes to cope with the overhead of zlib data streams
 
    uLongf CompBuffSize = (uLongf)(FileInSize + (FileInSize * 0.1) + 12);
    CompDataBuff = malloc((size_t)(CompBuffSize));
 
    //파일의 데이터를 소스 버퍼로 읽어들인다.
    fseek(FileIn, 0, SEEK_SET);
    fread(RawDataBuff, FileInSize, 1, FileIn);
 
    //데이터를 압축한다.
    uLongf DestBuffSize;
    compress2((Bytef*)CompDataBuff, (uLongf*)&DestBuffSize, (const Bytef*)RawDataBuff, (uLongf)FileInSize, Z_BEST_COMPRESSION);
 
    // 압축된 데이터를 디스크에 기록
    fwrite(CompDataBuff, DestBuffSize, 1, FileOut);
    return 0;        
}


출처: https://overface.tistory.com/30?category=452410 [임이지의 블로그]
728x90
반응형

'멀티미디어 > 압축(Compress)' 카테고리의 다른 글

ZLIB 사용하여 메모리에 압축 풀기  (0) 2021.01.06
Lempel-Ziv 알고리즘  (0) 2018.09.04
GZIP 구조  (0) 2017.10.14
Run Length Encoding(1)  (0) 2017.10.14
PKZIP 구조(2)  (0) 2016.01.19

관련글 더보기

댓글 영역