[c++] libjpeg-turbo와 이미지 포맷 변환
이미지를 다양한 포맷으로 변환하여 사용해야 할 때가 있습니다. C++에서 libjpeg-turbo 라이브러리를 사용하여 이미지를 JPEG 형식으로 변환하는 방법을 살펴보겠습니다.
libjpeg-turbo 소개
libjpeg-turbo는 JPEG 이미지를 빠르게 처리하기 위한 라이브러리로, SIMD 명령어를 이용하여 성능을 향상시킨 것이 특징입니다. 이 라이브러리를 사용하면 이미지를 빠르게 압축하고 해제할 수 있어서 이미지 변환에 효율적으로 활용할 수 있습니다.
라이브러리 설치
libjpeg-turbo 라이브러리는 여러 플랫폼에서 지원됩니다. 다양한 방법으로 라이브러리를 설치할 수 있으며, 각 플랫폼에 따라 설치 방법이 다를 수 있습니다.
이미지를 JPEG로 변환하는 예제
아래는 libjpeg-turbo를 사용하여 이미지를 JPEG로 변환하는 C++ 코드의 예제입니다.
#include <jpeglib.h>
void convertImageToJpeg(const unsigned char* imageData, int width, int height, int quality, const char* outputFilename) {
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE *outfile;
JSAMPROW row_pointer[1];
int row_stride;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
if ((outfile = fopen(outputFilename, "wb")) == NULL) {
fprintf(stderr, "Can't open %s\n", outputFilename);
return;
}
jpeg_stdio_dest(&cinfo, outfile);
cinfo.image_width = width;
cinfo.image_height = height;
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;
jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, quality, TRUE);
jpeg_start_compress(&cinfo, TRUE);
row_stride = width * 3;
while (cinfo.next_scanline < cinfo.image_height) {
row_pointer[0] = (JSAMPROW) &imageData[cinfo.next_scanline * row_stride];
(void) jpeg_write_scanlines(&cinfo, row_pointer, 1);
}
jpeg_finish_compress(&cinfo);
fclose(outfile);
jpeg_destroy_compress(&cinfo);
}
위 코드 예제는 libjpeg-turbo를 사용하여 이미지를 JPEG로 변환하는 함수인 convertImageToJpeg
를 보여주고 있습니다. 함수는 이미지 데이터, 너비, 높이, 품질 및 출력 파일 이름을 입력으로 받아 JPEG로 변환합니다.
사용 예시
const unsigned char* imageData; // 이미지 데이터
int width, height; // 이미지의 너비와 높이
int quality = 90; // JPEG 품질
const char* outputFilename = "output.jpg"; // 출력 파일 이름
convertImageToJpeg(imageData, width, height, quality, outputFilename);
결론
libjpeg-turbo 라이브러리는 이미지를 효율적으로 변환하기 위한 강력한 도구입니다. 위 예제를 참고하여 이미지를 JPEG로 변환하는 방법을 익혀보고, 다양한 포맷으로의 이미지 변환에 활용해 보세요.