掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
GIF画像サイズを取得する方法は? (ID:51829)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
//GIFHeader部分 int GetGIFSize(int GIFStream, int *gsize, int *width, int *height, int *Ncolos) { unsigned char count; unsigned char bitdata, bcindex,ratio; //int var_long; unsigned short var_short; unsigned char s,s1; char color[765]; //GIFファイルサイズ struct stat buf; fstat(GIFStream,&buf); *gsize = buf.st_size; // GIF 認識文字 "GIF" (0x47 0x49 0x46の固定値) if (_read(GIFStream,&s,3) == 3) { if (memcmp(&s, "GIF", 3) == 0) { printf("[GIF] GIF file\n"); } else { // fprintf(stderr, "%s : Not a GIF file\n", s); exit(1); } count += 3; } //ヴァージョンの確認 //("87a"の場合は,0x38 0x37 0x61の固定値 "89a"の場合は,0x38 0x39 0x61の固定値となる。) if (_read(GIFStream,&s1,3) == 3) { if (memcmp(&s1, "87a", 3)== 0) { printf("Version GIF file\n"); } else if (memcmp(&s1, "89a", 3)== 0) { printf("Version GIF file\n"); } else { //fprintf(stderr, "%s : Not a Version GIF file\n", s1); exit(1); } count += 3; } // GIF画像全体の幅 (0x1234の場合は,0x34 0x12と格納される。) if (_read(GIFStream,&var_short, 2) == 2) { printf(" Width : %ld [pixel]\n", var_short); *width = var_short; count += 2; } // GIF画像全体の高さ (0x1234の場合は,0x34 0x12と格納される。) if (_read(GIFStream,&var_short, 2) == 2) { printf(" Height : %ld [pixel]\n", var_short); *height = var_short; count += 2; } //color map がありますか?? unsigned char b = count++; *Ncolos = 1 << ((b & 7) + 1); if ((b &0x80) == 0) { printf("No color map\n"); *ncolors = 0; } //backgroud color ++count; //bitdata読み込み if (_read(GIFStream,&bitdata, 1) == 1) { unsigned bit = bitdata & 0x07; unsigned bbit = 1 << bit + 1; unsigned bbbit = bitdata >> 3; count +=1; } //背景色index if (_read(GIFStream,&bcindex, 1) == 1) { unsigned char bc = bcindex; printf(" \n"); count += 1; } //ピクセルの縦横比 if (_read(GIFStream,&ratio, 1) == 1) { unsigned char rt = ratio; printf(" \n"); //*pixcel = (var_short + 15)/64; が実際の比率 count += 1; } return count; } //Global Color Table Flag が存在する場合のTableの情報 /* int GIFColorTable(int GIFStream, int used, unsigned char *red, unsigned char *green, unsigned char *blue) { int size,i; unsigned char colortable[256][3]; struct channnel{ Red = 0; Blue = 1; Green = 2; } for(i = 0;i<size;i++){ _read(GIFStream,&colortable[i],3); } int receive,count; // ビットの並びは B G R 予約?????? for (i = 0; i < used; i++) { blue[i] = _read(GIFStream,&blue,1); green[i] = _read(GIFStream,&green,1); red[i] = _read(GIFStream,&red,1); receive = _read(GIFStream,&receive,1); count++; } return count; }*/ /*------------------------------------------------------------------*/ /* Image Block */ /*------------------------------------------------------------------*/ int ImageBlock(int GIFStream,int *leftposition, int *topposition, int *imagew, int *imageh, int *bsize) { int count = 0; int var_long; unsigned short var_short; unsigned char s2; // Image Separator (1byte) if (_read(GIFStream,&s2, 1) == 1) { if (memcmp(&s2, "2c", 1)== 0) { printf("Image block\n"); } else { exit(1); } count += 1; } //Image Left Position (0x1234の場合は,0x34 0x12と格納される。) if (_read(GIFStream,&var_long, 2) == 2) { *leftposition = var_long; count += 2; } // Image TOP Position (0x1234の場合は,0x34 0x12と格納される。) if (_read(GIFStream,&var_long, 2) == 2) { *topposition = var_long; count += 2; } // ImageBlockの幅 if (_read(GIFStream,&var_short, 2) == 2) { printf(" Width : %d [pixel]\n", var_short); *imagew = var_short; count += 2; } // ImageBlockの高さ if (_read(GIFStream,&var_short, 2) == 2) { printf(" Height : %d [pixel]\n", var_short); *imageh = var_short; count += 2; } //Local Color Table Flag, Interlace Flag //Sort Flag, Reserved, Size of Local Color Table if (_read(GIFStream,&var_long, 1) == 1) { count += 1; } //Local Color Table (Global Color Table Flagが1の場合に存在する。) //LZW Mimimum Code Side(LZWコードの最小ビット数) if (_read(GIFStream,&var_long, 1) == 1) { count += 1; } //Block Size(イメージサイズ) if (_read(GIFStream,&var_long, 1) == 1) { printf(" Block Size : %d [bit]\n", var_long); *bsize = var_long; count += 1; } else { fprintf(stderr, "GIF Image Block error\n"); } return count; } こんな感じでイメージサイズと高さ・幅を抽出できればと思ったのですがどうですか??
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.