버퍼에 이미지 데이트를 채운다음 해당 데이터를 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 파일로 저장한다. 저장된 이후에는 브라우저 또는 그림프로그램을 통해 확인한다.
반응형
최근댓글