GIFファイルをバイナリモードで呼び出してファイル情報を確認してみる
とタイトルが長くなってしまいましたが、今回やったことはこれだけです。
本当は使用目的があって作っていたプログラムでしたが効率が悪いことに気づいたので、ここでアウトプットしておきます。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
#include<stdio.h> void main(int argc, char *argv[]) { char *p_file; // ファイル名管理用 FILE *fpr; // 読み取りストリーム管理用FILE Pointer by Read int pos = 0; // ファイル内位置管理用(position) int c; // fgetの戻り値記憶用 int cnt_read=0; // 読み込み回数カウント int header[13]; // ヘッダー格納配列 int data_flg=0; int resolution=0; // ヘッダーの初期化 for(int i=0; i < 13; i++) header[i]=0x00; // open file p_file = argv[1]; fpr=fopen( p_file , "r" ); // read file while( (c=fgetc(fpr)) != EOF ){ if(cnt_read<13){ header[cnt_read] = c; }else if( c == 0x2c ){ break; } cnt_read++; } // file close fclose(fpr); // version printf("Version: "); for(int i=0;i<6;i++){ printf("%c",header[i]); } printf("\n"); // color resolution resolution=header[10]&0x70; resolution=resolution >> 4; resolution++; printf("ColorResolution: %d\n",resolution); // size int image_width=header[6]+header[7]*0x100; int image_height=header[8]+header[9]*0x100; printf("width: %dpx\nheight: %dpx",image_width,image_height); printf("\n"); } |
使用方法
使用方法はシンプルでコマンドライン引数としてgif画像のパスを与えてあげればOKです。
特にエラー時の処理等はしてないので、GIF以外のファイル指定やコマンドライン引数に問題がある場合でも普通に動いちゃうので注意です。
今回のプログラムでは、
- GIFバージョン
- カラーレゾリューション
- 縦横幅(px)
を表示してくれます。
コード解説
ファイルの読取モードを「rb(バイナリモード)」に指定することで1byte毎にデータを吐き出してくれます。
GIFのフォーマットはヘッダー部が13byte + 0~255*3byte なので、ひとまずバージョンやサイズ等のデータが格納されている頭13byteを今回はヘッダー配列に格納しています。
ImageBlock部分は0x2cから開始なので、そこから画像データの取得も可能です。
今回のプログラムで出しているColor Resolutionは1ドットを表すのに必要なビット数なので、こちらの数値を利用して画像の解析も可能かと思います!
是非お試しあれ!
参考にしたサイト
⇒【インターネットスクール 『まなぶ』】バイナリファイル操作
今回のブログ曲
今回投稿中に聴いていた曲はこちら