[C++] 26 libpngによるpng情報の取得

libpngを使ってpngファイルの縦横サイズと解像度のデータを取得しました。

width, height, dpi_x, dpi_yの値を配列std::array<int,4>にして戻り値としています。main関数は省略します。

#include "png.h"
#include <array>

std::array<int,4> getInfoPNG(const char*);

#define SIGNATURE_NUM 8
#include "process_image.h"
#include <string>

FILE *fi;
unsigned int width;
unsigned int height;
unsigned int res_x;
unsigned int res_y;
unsigned int readSize;
png_structp png;
png_infop info;
png_byte signature[8];

std::array<int,4> getInfoPNG(const char* filename){
	fi = fopen(filename, "rb");
	readSize = fread(signature, 1, SIGNATURE_NUM, fi);

	png = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
	info = png_create_info_struct(png);

	png_init_io(png, fi);
	png_set_sig_bytes(png, readSize);
	png_read_png(png, info, PNG_TRANSFORM_PACKING | PNG_TRANSFORM_STRIP_16, NULL);
	
	width = png_get_image_width(png, info);
  	height = png_get_image_height(png, info);
	res_x = png_get_x_pixels_per_inch(png,info);
	res_y = png_get_y_pixels_per_inch(png,info);

	png_destroy_read_struct(&png, &info, NULL);
  	fclose(fi);

	return {(int)width,(int)height,(int)res_x,(int)res_y};
}

参考サイト

[C++] 24 文字列のバイト列への変換 文字化け調査

文字化けの原因調査等に必要なので記録しておきます。

#include <string>
#include <iostream>
#include <stdio.h>
#include <vector>
#include <bitset>

using std::cout; using std::string;
using std::endl; using std::bitset;

void binary_convert(string str){
	for (int i = 0; i < str.length(); ++i) {
		bitset<8> bs4(str[i]);
		cout << str << " " << i+1 << "番目 " << bs4 << endl;
	}
	cout << "end"<< endl;
}

int main(int argc, char **argv){
	string str1 = "123";
	string str2 = "バイト列";

	binary_convert(str1);
	binary_convert(str2);
}
--------------------------------------------------

出力
--------------------------------------------------
123 1番目 00110001
123 2番目 00110010
123 3番目 00110011
end
バイト列 1番目 11100011
バイト列 2番目 10000011
バイト列 3番目 10010000
バイト列 4番目 11100011
バイト列 5番目 10000010
バイト列 6番目 10100100
バイト列 7番目 11100011
バイト列 8番目 10000011
バイト列 9番目 10001000
バイト列 10番目 11100101
バイト列 11番目 10001000
バイト列 12番目 10010111
end