2bit パレット使用の画像を読み込んだ例。
#pragma once #include <cstdlib> #include <iostream> #include <bitset> #include <png.h> #pragma comment(lib,"libpng16d.lib") //エラーの時強制終了 void abort_(const char* c) { printf(c); abort(); }
//! @brief pngファイル読み込み関数 //! @param [in] file_name ファイル名 //! @param [out] width 画像幅(ピクセル) //! @param [out] height 画像高さ(ピクセル) //! @param [out] color_type RGBかRGBAか...等 //! @param [out] bit_depth チャンネルのビット数 //! @param [out] row_pointers 画像データへのポインタのポインタ //! @retval true 成功 //! @retval false 中断 bool read_png( const char* file_name, int* width, int* height, png_byte* color_type, png_byte* bit_depth, png_bytep** row_pointers ) { png_byte header[8]; // 8 is the maximum size that can be checked FILE* fp = fopen(file_name, "rb"); if (!fp) { abort_("[read_png_file] File could not be opened for reading"); } fread(header, 1, 8, fp); if (png_sig_cmp(header, 0, 8)) { abort_("[read_png_file] File is not recognized as a PNG file"); } png_structp png_ptr; png_infop info_ptr; /* initialize stuff */ png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) abort_("[read_png_file] png_create_read_struct failed"); info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) abort_("[read_png_file] png_create_info_struct failed"); if (setjmp(png_jmpbuf(png_ptr))) abort_("[read_png_file] Error during init_io"); png_init_io(png_ptr, fp); png_set_sig_bytes(png_ptr, 8); png_read_info(png_ptr, info_ptr); ///////////////////////////////////////// // 画像情報の取得 *width = png_get_image_width(png_ptr, info_ptr); *height = png_get_image_height(png_ptr, info_ptr); *color_type = png_get_color_type(png_ptr, info_ptr); *bit_depth = png_get_bit_depth(png_ptr, info_ptr); // ///////////////////////////////////////// std::cout << "width : " << *width << std::endl; std::cout << "height: " << *height << std::endl; std::cout << "colortype: " << (int)*color_type << std::endl; std::cout << "bitdepth: " << (int)*bit_depth << std::endl;
///////////////////////////////////////// // グレイスケール パレットの時だけ処理する if ( *color_type == (PNG_COLOR_TYPE_GRAY | PNG_COLOR_TYPE_PALETTE)) { ///////////////////////////////////////// // パレット取得 png_colorp palette; int num; png_get_PLTE(png_ptr, info_ptr, &palette, &num); ///////////////////////////////////////// // パレット内容表示 std::cout << std::endl << "palette ( " << num << " )" << std::endl; for (int i = 0; i < num; i++) { std::cout << "[" << std::bitset<2>(i) << "] " << "(" << (int)palette[i].red << "," << (int)palette[i].green << "," << (int)palette[i].blue << ")" << std::endl; } }
///////////////////////////////////////// else { fclose(fp); return false; } int number_of_passes; number_of_passes = png_set_interlace_handling(png_ptr); png_read_update_info(png_ptr, info_ptr); /* read file */ if (setjmp(png_jmpbuf(png_ptr))) abort_("[read_png_file] Error during read_image"); ///////////////////////////////////////// // 画像の読み込み *row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * *height); for (int y = 0; y < *height; y++) (*row_pointers)[y] = (png_byte*)malloc(png_get_rowbytes(png_ptr, info_ptr)); png_read_image(png_ptr, *row_pointers); // ///////////////////////////////////////// fclose(fp); return true; }
int main() { int width; int height; png_byte color_type; png_byte bit_depth; png_bytep* row_pointers; bool ret; //////////////////////////////// // 画像読み込み ret = read_png( R"(c:\test\test_2bit_palette_1x8.png)", &width, &height, &color_type, &bit_depth, &row_pointers ); // //////////////////////////////// if (ret == false) { return -1; }
//////////////////////////////// // 内容を表示 png_bytep yhead = row_pointers[0]; png_bytep xpix = yhead; std::cout << std::endl; std::cout << std::bitset<8>(xpix[0]); std::cout << std::bitset<8>(xpix[1]) << std::endl; // ///////////////////////////////////////////////
/////////////////////////////////////////////// // メモリの解放 for (size_t i = 0; i < (size_t)height; i++) { png_bytep yhead = row_pointers[i]; free(yhead); } free(row_pointers); // /////////////////////////////////////////////// int i; std::cin >> i; return 0; }
libpng 1bit / 4bit PNG_COLOR_TYPE_GRAY 出力
libpng PNG_COLOR_TYPE_PALETTEでパレットを使った出力
libpng パレット色(PNG_COLOR_TYPE_PALETTE)画像の読み込み
libpng 16bit PNG_COLOR_TYPE_GRAY 読み込み