make_png.cpp

16進RGBからPNG画像に変換

16進RGBからPNG画像に変換

  • タグ:
  • タグはありません
#include<stdio.h>
#include<stdlib.h>

#include<fcntl.h>

#pragma comment(lib, "../pngmake/zlib.lib")
#pragma comment(lib, "../pngmake/libpng.lib")

//#ifdef _MSC_VER	//VC++でのコンパイル
#include<io.h>
#include "../pngmake/png.h"
//#else
//#include <png.h>
//#endif

#define WIDTH 256
#define HEIGHT 224


void write_png(const char *file_name, unsigned char **image, int iWidth, int iHeight)
{
	FILE            *fp;
	png_structp     png_ptr;
	png_infop       info_ptr;
	
	fp = fopen(file_name, "wb");                            // まずファイルを開きます
	png_ptr = png_create_write_struct(                      // png_ptr構造体を確保・初期化します
	                PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
	info_ptr = png_create_info_struct(png_ptr);             // info_ptr構造体を確保・初期化します
	png_init_io(png_ptr, fp);                               // libpngにfpを知らせます
	png_set_IHDR(png_ptr, info_ptr, iWidth, iHeight,          // IHDRチャンク情報を設定します
	                8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
	                PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
	png_write_info(png_ptr, info_ptr);                      // PNGファイルのヘッダを書き込みます
	png_write_image(png_ptr, image);                        // 画像データを書き込みます
	png_write_end(png_ptr, info_ptr);                       // 残りの情報を書き込みます
	png_destroy_write_struct(&png_ptr, &info_ptr);          // 2つの構造体のメモリを解放します
	fclose(fp);                                             // ファイルを閉じます
	return;
}


int main()//char *argv[], int argc)
{
	char *argv[] = {"", "out.dat", "out.png"};
	int argc = 3;

	int i;
	unsigned char **image;      // image[HEIGHT][WIDTH]の形式です
	FILE *fp;

	int x,y;
	char buf[1024];

	if(argc!=3){
		printf("option err\n");
		return -1;
	}

	image = (unsigned char**)malloc(sizeof(png_bytep)*HEIGHT); // 以下3行は2次元配列を確保します
	for(i=0; i<HEIGHT; i++){
		image[i] = (unsigned char*)malloc(sizeof(png_byte)*WIDTH*3);
	}

	fp = fopen(argv[1], "r");
	if(fp==NULL){
		printf("no file\n");
		return -2;
	}

	x=0;
	y=0;

	fgets(buf, 1023, fp);
	fgets(buf, 1023, fp);
	fgets(buf, 1023, fp);

	x = y = 0;
	while(fgets(buf, 1023, fp)){
		int col;
		unsigned char R, G, B;
		sscanf(buf, "%4x\n", &col);
		R = col & 0x001F;
		col >>= 5;
		G = col & 0x001F;
		col >>= 5;
		B = col & 0x001F;

		image[y][x*3] = R << 3;
		image[y][x*3+1] = G << 3;
		image[y][x*3+2] = B << 3;
		x++;
		if(x==WIDTH){
			x=0;
			y++;
			if(y==HEIGHT) break;
		}
	}
	fclose(fp);

	printf("%d %d\n", x, y);

	write_png(argv[2], image, WIDTH, HEIGHT);  // PNGファイルを作成します

	system(argv[2]);
	printf("write ok\n");

	for(i=0; i<HEIGHT; i++) free(image[i]);  // 以下2行は2次元配列を解放します
	free(image);

	printf("end\n");

	return 0;
}