[c++] libjpeg-turbo와 이미지 처리

libjpeg-turbo는 JPEG 이미지를 빠르게 압축하고 해제하는 데 사용되는 오픈 소스 라이브러리입니다. 이 라이브러리는 기존의 libjpeg보다 약 2배 빠른 성능을 제공하며, 멀티코어 프로세서에서 빠르게 동작하도록 최적화되어 있습니다.

이제 libjpeg-turbo를 사용하여 C++ 프로그램에서 이미지를 처리하는 방법을 알아보겠습니다.

libjpeg-turbo 설치

먼저, libjpeg-turbo를 시스템에 설치해야 합니다. 다음은 Ubuntu에서의 설치 방법입니다.

sudo apt-get install libjpeg-turbo8-dev

다른 운영 체제의 경우, libjpeg-turbo의 공식 웹사이트에서 소스 코드를 다운로드하여 컴파일하고 설치해야 할 수도 있습니다.

JPEG 이미지 읽기

libjpeg-turbo를 사용하여 C++ 프로그램에서 JPEG 이미지를 읽는 방법은 다음과 같습니다.

#include <turbojpeg.h>
#include <iostream>
#include <fstream>

int main() {
    std::ifstream inFile("input.jpg", std::ios::binary);
    inFile.seekg(0, std::ios::end);
    size_t fileSize = inFile.tellg();
    inFile.seekg(0, std::ios::beg);
    char* buffer = new char[fileSize];
    inFile.read(buffer, fileSize);
    inFile.close();

    tjhandle jpegDecompressor = tjInitDecompress();
    int width, height;
    tjDecompressHeader2(jpegDecompressor, (unsigned char*)buffer, fileSize, &width, &height, NULL);
    unsigned char* image = new unsigned char[width * height * 3];
    tjDecompress2(jpegDecompressor, (unsigned char*)buffer, fileSize, image, width, 0, height, TJPF_RGB, 0);
    
    // 이미지 처리 작업 수행

    delete[] buffer;
    delete[] image;
    tjDestroy(jpegDecompressor);
    return 0;
}

위의 예제는 libjpeg-turbo를 사용하여 JPEG 이미지를 읽고 RGB 형식의 이미지로 디코딩하는 과정을 보여줍니다.

JPEG 이미지 쓰기

이어서, libjpeg-turbo를 사용하여 C++ 프로그램에서 이미지를 JPEG 형식으로 저장하는 방법을 확인해 봅시다.

#include <turbojpeg.h>
#include <iostream>
#include <fstream>

int main() {
    // 이미지 처리 작업 수행

    int width = 800;
    int height = 600;
    unsigned char* image = new unsigned char[width * height * 3];
    // 이미지 데이터 채우는 작업 수행

    tjhandle jpegCompressor = tjInitCompress();
    unsigned char* jpegBuf = NULL;
    unsigned long jpegSize = 0;
    tjCompress2(jpegCompressor, image, width, 0, height, TJPF_RGB, &jpegBuf, &jpegSize, TJSAMP_444, 80, TJFLAG_FASTDCT);
    tjDestroy(jpegCompressor);
    
    std::ofstream outFile("output.jpg", std::ios::binary);
    outFile.write((const char*)jpegBuf, jpegSize);
    outFile.close();

    tjFree(jpegBuf);
    
    delete[] image;
    return 0;
}

위의 예제는 libjpeg-turbo를 사용하여 RGB 형식의 이미지 데이터를 JPEG 형식으로 압축하는 과정을 보여줍니다.

마치며

libjpeg-turbo를 사용하면 이미지 처리 속도를 높일 수 있으며, 특히 대용량 이미지 처리에 유용합니다. 여기서는 libjpeg-turbo의 기본 사용법에 대해 알아보았지만, 더 많은 세부 기능을 사용하여 원하는 이미지 처리를 할 수 있습니다.

더 많은 정보를 원하시면 libjpeg-turbo 공식 웹사이트를 방문하시기 바랍니다.