[c++] libpng 영상 처리

libpng은 PNG(Portable Network Graphics) 이미지 형식을 읽고 쓰는 라이브러리로, C++에서도 사용할 수 있습니다. 이 라이브러리를 사용하여 이미지 파일을 읽고 처리하는 방법을 알아보겠습니다.

libpng 설치

libpng은 대부분의 리눅스 배포판에 기본으로 설치되어 있습니다. 그러나 필요한 경우 직접 설치해야 할 수도 있습니다.

Ubuntu에서 libpng 설치하기

sudo apt-get install libpng-dev

Fedora에서 libpng 설치하기

sudo dnf install libpng-devel

libpng을 사용한 이미지 읽기

다음은 libpng을 사용하여 이미지를 읽는 간단한 예제 코드입니다.

#include <iostream>
#include <png.h>

int main() {
    FILE *fp = fopen("image.png", "rb");
    png_structp png = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    png_infop info = png_create_info_struct(png);
    png_init_io(png, fp);
    png_read_info(png, info);

    int width = png_get_image_width(png, info);
    int height = png_get_image_height(png, info);
    int bit_depth = png_get_bit_depth(png, info);
    int color_type = png_get_color_type(png, info);

    std::cout << "Width: " << width << ", Height: " << height << ", Bit depth: " << bit_depth << ", Color type: " << color_type << std::endl;

    fclose(fp);
    return 0;
}

위 코드는 libpng을 사용하여 이미지의 너비, 높이, 비트 깊이와 컬러 타입을 출력합니다.

libpng을 사용한 이미지 처리

libpng을 사용하여 이미지를 처리하는 방법은 다양합니다. 예를 들어 이미지의 픽셀 값을 변경하거나 필터를 적용할 수 있습니다.

void processImage(const char *inputFile, const char *outputFile) {
    // 이미지 읽기
    png_bytep row_pointers[height];
    for (int y = 0; y < height; y++)
        row_pointers[y] = (png_byte*)malloc(png_get_rowbytes(png,info));
    png_read_image(png, row_pointers);

    // 이미지 처리

    // 이미지 쓰기
    FILE *fp = fopen(outputFile, "wb");
    png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    png_infop info = png_create_info_struct(png);
    png_init_io(png, fp);
    png_set_IHDR(png, info, width, height, bit_depth, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
    png_write_info(png, info);
    png_write_image(png, row_pointers);
    png_write_end(png, NULL);
    fclose(fp);

    // 메모리 해제
    for (int y=0; y<height; y++)
        free(row_pointers[y]);
}

위 코드는 processImage 함수를 사용하여 이미지 파일을 읽고 처리한 뒤 새로운 파일로 저장하는 과정을 보여줍니다.

이처럼 libpng을 사용하면 C++에서 PNG 이미지를 읽고 쓰고 처리할 수 있습니다.

이 글은 아래의 참고 문헌을 참고하여 작성되었습니다.