スポンサーリンク

libpng PNG_COLOR_TYPE_PALETTEでパレットを使った出力

概要

GrayScaleの値をパレット色に置き換える。

ソースコード

Color Typeを PNG_COLOR_TYPE_GRAY | PNG_COLOR_TYPE_PALETTE

あとは png_set_PLTE でパレットを設定する。

それ以外はRGBやただのグレースケールの時と変わらない。

#include <cstdlib>

#include <png.h>

#pragma comment(lib,"libpng16d.lib")

//エラーの時強制終了
void abort_(const char* c) {
  printf(c);
  abort();
}

int main()
{
  int width;
  int height;
  png_byte color_type = PNG_COLOR_TYPE_GRAY | PNG_COLOR_TYPE_PALETTE;
  png_byte bit_depth = 1;


  png_bytep* row_pointers;
  ////////////////////////////////
  // 画像作成
  height = 1;
  width = 8;
  row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * height);
  row_pointers[0] = (png_byte*)malloc(1);
  png_byte* xhead;
  xhead = row_pointers[0];
  xhead[0] = 0b01010111;
  //
  ////////////////////////////////

const char* file_name = R"(c:\test\test_palette.png)"; /* create file */ FILE* fp = fopen(file_name, "wb"); if (!fp) abort_("[write_png_file] File could not be opened for writing"); png_structp png_ptr; /* initialize stuff */ png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) abort_("[write_png_file] png_create_write_struct failed"); png_infop info_ptr; info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) abort_("[write_png_file] png_create_info_struct failed"); if (setjmp(png_jmpbuf(png_ptr))) abort_("[write_png_file] Error during init_io");
  ////////////////////
  ////// パレット
  png_colorp palette = nullptr;

  palette = (png_colorp)png_malloc(png_ptr, sizeof(png_color) * 2);
  palette[0].red = 255;
  palette[0].green = 0;
  palette[0].blue = 0;
  palette[1].red = 0;
  palette[1].green = 255;
  palette[1].blue = 0;

  png_set_PLTE(png_ptr, info_ptr, palette, 2);
  //////
  ////////////////////
  png_init_io(png_ptr, fp);

  /////////////////////////////////////
  //ヘッダの設定
  if (setjmp(png_jmpbuf(png_ptr)))
    abort_("[write_png_file] Error during writing header");

  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);
  //
  /////////////////////////////////////


  /////////////////////////////////////
  // 画像のファイル出力
  if (setjmp(png_jmpbuf(png_ptr)))
    abort_("[write_png_file] Error during writing bytes");

  png_write_image(png_ptr, row_pointers);

  // end write
  if (setjmp(png_jmpbuf(png_ptr)))
    abort_("[write_png_file] Error during end of write");

  png_write_end(png_ptr, NULL);
  //
  /////////////////////////////////////


  fclose(fp);


  ///////////////////////////////////////////////
  // メモリの解放
  for (size_t i = 0; i < (size_t)height; i++) {
    png_bytep yhead = row_pointers[i];
    free(yhead);
  }
  free(row_pointers);
  //
  ///////////////////////////////////////////////

}

libpngを試す(CMakeビルド)

libpngを試す(ファイル読み込み)

libpngを試す(ファイル書き込み)

libpng 1bit / 4bit PNG_COLOR_TYPE_GRAY 出力

libpng PNG_COLOR_TYPE_PALETTEでパレットを使った出力

libpng 1bit Grayscale画像の読み込み

libpng パレット色(PNG_COLOR_TYPE_PALETTE)画像の読み込み

libpng 16bit PNG_COLOR_TYPE_GRAY 読み込み

libpng 16bit PNG_COLOR_TYPE_GRAY 出力

setjmp / longjmp

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: