掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
GIF画像サイズを取得する方法は? (ID:51830)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
気づいた部分を修正してみました。 仕様書を見ながらソースを追えば解かってくるかと。 ただ動作確認していないので正しい保証はありません。参考程度に。 ----------------------------------------------- int GetGIFSize( int GIFStream, int *gsize, int *width, int *height, int *Ncolos ) { :省略 // //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; // bitdataの最上位ビットをチェックしてGlobal Color Tableが存在するなら // 色数を得る。存在しない場合は 0 を設定 *Ncolos = ((bitdata & 0x80) ? (2 << (bitdata & 0x07)) : 0); } :省略 } //Global Color Table Flag が存在する場合のTableの情報 int GIFColorTable( int GIFStream, int used, unsigned char *red, unsigned char *green, unsigned char *blue ) { // ビットの並びはRGB // red,green,blueはメモリ確保済みとして for (int i = 0; i < used; i++) { _read(GIFStream, &red[i], 1); _read(GIFStream, &green[i], 1); _read(GIFStream, &blue[i], 1); } return used * 3 // Tableのサイズ(Byte)を返しておく? } /*------------------------------------------------------------------*/ /* Image Block */ /*------------------------------------------------------------------*/ int ImageBlock( int GIFStream, int *leftposition, int *topposition, int *imagew, int *imageh, int *bsize ) { :省略 // // Image Separator (1byte) // if (_read(GIFStream,&s2, 1) == 1) { // if (memcmp(&s2, "2c", 1)== 0) { // printf("Image block\n"); // } // else { // exit(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"); // } //Block Size(イメージサイズ) *bsize = 0; while (_read(GIFStream,&var_long, 1) == 1) { if (var_long == 0) break; *bsize += (1 + var_long); // データ副ブロックのブロック寸法領域のサイズを足す _lseek(GIFStream, var_long, SEEK_CUR); // 次のデータ副ブロック開始位置へ } return count + *bsize; } /*------------------------------------------------------------------*/ /* main /*------------------------------------------------------------------*/ int main() { int GIFStream = _open("xxxx.gif", ...); // Logical Screen Descriptor 情報取得 int gsize, width, height, Ncolos; GetGIFSize(GIFStream, &gsize, &width, &height, &Ncolos); // Global Color Table 情報取得 if (Ncolos > 0) GIFColorTable(GIFStream, Ncolos, ...); // ブロックを解析 int var_long, iImageNum = 0; while (_read(GIFStream, &var_long, 1) == 1) { switch (var_long) { case 0x2C: // イメージ記述ブロック ImageBlock(GIFStream, ...); iImageNum++; break; case 0x3B: // ストリーム終了 goto End; case 0x21: // 拡張ブロック _lseek(GIFStream, 1, SEEK_CUR); // ラベル領域分を飛ばす default: while (_read(GIFStream, &var_long, 1) == 1) { if (var_long == 0) break; _lseek(GIFStream, var_long, SEEK_CUR); // 次のデータ副ブロック開始位置へ } break; } } :End // 後処理 printf("%d 枚の画像が格納されています\n", iImageNum); return 0; }
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.