入力画像サイズを640*480、出力は512*512にしたいのですがどのようにしたらよいかわかりません。BMPを扱っています。ヘッダー部分についても勉強してるんですが・・・。
画像の切り出しと考えていいのでしょうか?x軸は640→512、y軸は480→512、y軸の余分な部分は黒で塗りつぶすというふうに考えてるんですが。プログラミングがよく分からないです・・・。C言語にた作成中です。
どなたか教えて頂けないでしょうか?
画像処理ソフトで処理...(w。
バイナリ処理でいいなら、ヘキサエディタで開いてヘッダ・データと睨めっこ。
DIBを使うならそれなりの処理って感じですか。
創作プロ街の(http://www.sm.rim.or.jp/~shishido/)この辺で。
http://www.sm.rim.or.jp/~shishido/graphics.html
StretchDIBits関数があります。
伸縮可能です。
>余分な部分は黒で塗りつぶす
FillRectでどうでしょう
あ、表示ではなく、画像そのもののサイズですか・・・。
失礼しました
> 画像そのもののサイズ
いや、この文面だと表示時じゃないの?
ただリアルタイムに処理する理由もわかんないので、ファイル自体を変更する方法も書いてみたり。
そういや、StretchBltなんてなのもあってね。使用注意だけど(w
>いや、この文面だと表示時じゃないの?
んー、そう言われればそうかも(^^;
>画像の切り出し
これって伸縮じゃなくって切り取りですね。
DIBSectionを作成し、BitBltで座標指定すれば
表示出来ます。
みなさんアドバイス有り難うございます!
実はC言語にて作成したいのですが・・・。
> C言語にて作成
もしかしてAPIを一切使わずに表意って事??
それとも表示するのわけではないの??
どちらにしろ、プロ街を一読すれば多少は見えてくると思うけどな。
なにがどう分からんのか、もうちょっと具体的に。
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,θに置き換えるだけ。(^^;;
> unix/Linux
Visual C++は動かないと思うが(w。
> APIはクラスじゃないっす
いや、クラスの話は全然してないし。
あ、もしかしてAPIと言う単語の意味がわからないとか?
皆さんアドバイスありがとうございます!
なーめさんのヒントを参考に進めてみたいと思っております。
なーめさん宜しくです^^;
また、他の方々のご意見も参考に、いろいろ勉強していこう思います。
ありがとうございます(感謝)