[c++] libpng 프로그래밍

libpng는 PNG(Portable Network Graphics) 이미지 포맷을 다루기 위한 라이브러리로, 이미지를 읽고 쓰는 기능을 제공합니다.

libpng 설치

libpng를 설치하려면 디렉토리 내에서 아래의 명령어를 실행합니다:

sudo apt-get install libpng-dev

이미지 읽기

libpng를 사용하여 이미지를 읽는 예제 코드는 다음과 같습니다:

#include <stdio.h>
#include <png.h>

void read_png_file(char *filename) {
   png_byte header[8];

   FILE *fp = fopen(filename, "rb");
   fread(header, 1, 8, fp);

   if (png_sig_cmp(header, 0, 8)) {
      fclose(fp);
      // 에러 처리
   }

   png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
   if (!png_ptr) {
      fclose(fp);
      // 에러 처리
   }

   png_infop info_ptr = png_create_info_struct(png_ptr);
   if (!info_ptr) {
      png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
      fclose(fp);
      // 에러 처리
   }

   png_init_io(png_ptr, fp);
   png_set_sig_bytes(png_ptr, 8);
   
   png_read_info(png_ptr, info_ptr);

   int width = png_get_image_width(png_ptr, info_ptr);
   int height = png_get_image_height(png_ptr, info_ptr);
   png_byte color_type = png_get_color_type(png_ptr, info_ptr);
   png_byte bit_depth = png_get_bit_depth(png_ptr, info_ptr);

   // 이미지 처리

   fclose(fp);
}

이미지 쓰기

libpng를 사용하여 이미지를 쓰는 예제 코드는 다음과 같습니다:

#include <stdio.h>
#include <png.h>

void write_png_file(char *filename, int width, int height, png_byte color_type, png_byte bit_depth) {
   FILE *fp = fopen(filename, "wb");
   if (!fp) {
      // 에러 처리
   }

   png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
   if (!png_ptr) {
      fclose(fp);
      // 에러 처리
   }

   png_infop info_ptr = png_create_info_struct(png_ptr);
   if (!info_ptr) {
      png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
      fclose(fp);
      // 에러 처리
   }

   png_init_io(png_ptr, fp);

   png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
   png_write_info(png_ptr, info_ptr);

   // 이미지 처리

   png_write_end(png_ptr, NULL);
   fclose(fp);
}

위 코드는 libpng를 사용하여 이미지를 읽고 쓰는 기본적인 방법을 보여줍니다. 물론 복잡한 이미지 처리를 위해서는 추가적인 기능을 사용해야 합니다.

참고 자료