掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
画像サイズを変換するには? (ID:52615)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
APIはクラスじゃないっす。 もしかして kaka さんは unix/Linux ですか。 stat でファイルサイズを調べて、 unsigned char * img = (unsigned char *)malloc( s_stat.st_size ); BMP 全体を fread() でimgに読み込んで、 先頭から(BITMAPFILEHEADER) 'BM' を確認 次の4バイトをlongでキャストしてがファイルサイズと同じか確認 次の4バイトは Reserve なので無視 次の4バイトはイメージデータのオフセット。 この次の4バイトが肝心。 CORE/INFO の区別が来る。(BITMAPINFOHEADER/BINTMAPCOREHEADER) 実際にはどちらかの構造体のサイズだ。 (あまり見かけないが、BITMAPV4HEADER/BITMAPV5HEADER/...もあります) 次に構造体の内容により(8bpp以下なら)カラーテーブルが来る。 その次が 上記オフセットで示されるイメージデータだ。 イメージデータの並びは 2/4/8/16/24/32 bpp と 圧縮形式:BI_RGB/BI_RLn などにより異なる。 非圧縮(BI_RGB)でも、ラスタ単位で4バイト境界で、 さらに最下ラスタから順に上へ向かって格納されていることも注意だ。 ( width * 3 + 3 ) & ( -4 ) ... 24bpp か。 (640/512 に限定なら無視してかまわないが...) 24bpp/BI_RGB では B,G,R の順(のはず) 個人的な使用に限るなら、ファイルタイプは限定されるはずだから、 640x480 と 512x512 のヘッダをそれぞれ実ファイルから取得して unsigned char bmp640x480[] = { .... }; unsigned char bmp512x512[] = { .... }; などと定数配列定義しておき、 640x480 の入力のときには memcmp() で確認。 出力時には 512x512 のヘッダの後にイメージを連結してやればよい。 24bpp/BI_RGB ならばイメージの処理はつぎのとおり。 unsigned char src[640*480x3]; unsigned char dst[512*512*3]; unsigned char * ps, * pd; int cx,cy; // src 読み込み処理は省略した memset( dst, 0, sizeof(dst)); // BLACK for( cy = 0; cy < 480; cy ++ ) { ps = src + (640*3)*cy; pd = dst + (512*3)*(cy+36); for( cx = 0; cx < 512; cx ++ ) { *ps++ = *pd++; // B *ps++ = *pd++; // G *ps++ = *pd++; // R } } if( fp = fopen( "out.bmp", "wb" )) { fwrite( bmp512x512, 1, sizeof(bmp512x512),fp ); fwrite( dst,1,sizeof(dst),fp ); fclose( fp ); } なお、コンパイルとテストはしてないので、自分で確認してね。 私事:CD のラベル用に四角いビットマップを扇型に変形したりしてます。 X,Y -> r,θに置き換えるだけ。(^^;;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.