掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
GIF画像サイズを取得する方法は? (ID:51831)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
やって見たのですが、どうしてもGlobal Color Table でエラーが出てしまい回避出来ません。ご教授お願いします。 #include <stdio.h> #include <malloc.h> #include <string.h> #include <io.h> #include <fcntl.h> #include <stdlib.h> //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; //bitdataの最上位ビットをチェックしてGlobal Color Table が存在するなら //色数を得る。存在しない場合は、0を設定。 *Ncolos = ((bitdata & 0x80) ? (2 << (bitdata & 0x07)): 0); } //背景色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, long used, unsigned char *red, unsigned char *green, unsigned char *blue) { //ビットの並びはRGB //red,blue,greenはメモリ確保済みとして、 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; } /*------------------------------------------------------------------*/ /* 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(" ImWidth : %d [pixel]\n", var_short); *imagew = var_short; count += 2; } // ImageBlockの高さ if (_read(GIFStream,&var_short, 2) == 2) { printf(" ImHeight : %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"); }*/ //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("F:\\開発\\GIF関連\\GIF画像\\m1.gif", _O_RDONLY|_O_BINARY); //Logical Screen Descripter 情報取得 int gsize, width, height, Ncolos; GetGIFSize(GIFStream, &gsize, &width, &height, &Ncolos); //Global Color Table情報取得 int used ; unsigned char red,blue, green; if (Ncolos > 0) GIFColorTable(GIFStream, used, &red, &green, &blue); //ブロックを解析 int var_long, iImageNum = 0; int leftposition, topposition, imagew, imageh, bsize; while (_read(GIFStream, &var_long, 1) == 1) { switch (var_long){ case 0x2C : //イメージ記述ブロック ImageBlock(GIFStream,&leftposition, &topposition, &imagew, &imageh, &bsize); 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.