​버퍼에 이미지 데이트를 채운다음 해당 데이터를 jpeg로 저장하는 샘플이다. 

     

    버퍼를 채우는 요소는 카메라 디바이스일 수도 있고, 다른 이미지 파일에서 추출한 영상데이터 또는 사용자가 테스트를 위해서 생성한 영상(일반적으로 컬러-바)을 jpeg 파일로 저장하는 할 수 있다.

     

    /* PPM to JPEG Test Program
     * ------------------------
     * Test version
     * AUTH : linux-cat@hanmail */
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
     
    #include <jpeglib.h>
     
    #define PBUFF 230400
    #define WIDTH 320
    #define HEIGHT 240
     
    void Usage(void) {
        printf(" Usage Ex : buff2jpg jpegfile.jpg\n");
            exit(0);
    }
     
     
    GLOBAL(void) WriteJpegFile(char* FileName,int Quality, int ImgWidth, int ImgHeight, unsigned char *ImgBuffer)
    {
            // JPEG 압축 관련 구조체 생성
            struct jpeg_compress_struct cinfo;
     
            // JPEG 에러 핸들러 구조체 생성
            struct jpeg_error_mgr jerr;
     
            // 파일 저장용 디스크립터
            FILE* SaveFile;
     
            // JSAMPLE의 row[s]를 포인팅
            JSAMPROW row_pointer[1];
     
            // BPP 적용된 라인길이를 담을 변수
            int row_stride;
     
            // 에러 헨들러의 포인트를 넣는다.
            cinfo.err = jpeg_std_error(&jerr);
     
            // JPEG 압축 Object를 초기화 한다.
            jpeg_create_compress(&cinfo);
     
            // 이미지 데이터를 바이너리 파일로 기록하기 위해서 파일을 생성한다.
            if((SaveFile = fopen(FileName,"wb")) == NULL)
            {
                    fprintf(stderr, "%s - File Open Failure.n",FileName);
                    exit(1);
            }
     
            jpeg_stdio_dest(&cinfo, SaveFile);
     
            // 사용자 변경 파라메터를 넣는다.
            cinfo.image_width = ImgWidth;
            cinfo.image_height = ImgHeight;
            cinfo.input_components = 3;
            cinfo.in_color_space = JCS_RGB;
     
            // 디폴트 파라메터 설정
            jpeg_set_defaults(&cinfo);
     
            // JPEG 압출률 설정
            jpeg_set_quality(&cinfo,Quality,TRUE);
     
            // JPEG 압축 시작
            jpeg_start_compress(&cinfo, TRUE);
     
            // RGB의 가로 길이를 구현하는데 필요한 배열 길이를 저장
            row_stride = ImgWidth * 3;
         
            // 이미지 버퍼에서 한 줄씩 jpeg_write_scanline 함수로 보냄
            while(cinfo.next_scanline < cinfo.image_height)
            {
                    row_pointer[0] = &ImgBuffer[cinfo.next_scanline * row_stride];
                    (void) jpeg_write_scanlines(&cinfo,row_pointer,1);
        }
     
            jpeg_finish_compress(&cinfo);
            fclose(SaveFile);
     
    }
     
    int main(int argc, char **argv)
    {
            unsigned char buffer[PBUFF]={255,};
     
            if(argc!=2) Usage();
     
            WriteJpegFile(argv[1],70,WIDTH,HEIGHT,BufferPpm);
     
            // Excute Description
     
            return 0;
    }

     

    본 예제는 libjpeg를 이용하고 있으므로 아래와 같이 컴파일 할 수 있다. 

     

    $ gcc -o buffer2jpeg buffer2jpeg.c -ljpeg

     

     

    예제 소스에서는 320x240해상도에 각 버퍼를 255로 초기화 하였으므로, 실제 지정된 사이즈의 흰색으로 채워진 버퍼를 jpeg 파일로 저장한다. 저장된 이후에는 브라우저 또는 그림프로그램을 통해 확인한다. 

     

    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기