- ベストアンサー
C++Builder5で画像の結合
C++Builder5で複数の画像を1つの画像にして保存したいのですがそのような事は出来るのでしょうか? 画像の形式はbmpと考えております。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
できますよ。 ただし、画像の並べ方(縦、横、その他)、それぞれの画像のサイズが異なる場合の対処法(伸ばす縮める切取るその他)など考えなきゃならない点が色々ありますし、その仕様によって当然コードも変ってきます。 とりあえず、 2枚の画像を横に並べる。 その際、2枚目の画像のサイズは1枚目と同じ高さになるよう変換する。 これだとこんな感じ。 Graphics::TBitmap* b1 = new Graphics::TBitmap; Graphics::TBitmap* b2 = new Graphics::TBitmap; Graphics::TBitmap* b3 = new Graphics::TBitmap; b1->LoadFromFile( "file1.bmp" ); b2->LoadFromFile( "file2.bmp" ); int stretched_width = b1->Height == b2->Height ? b2->Width : b2->Width * b1->Height / b2->Height; b3->Height = b1->Height; b3->Width = b1->Width + stretched_width; b3->Canvas->Draw( 0, 0, b1 ); b3->Canvas->StretchDraw( TRect( b1->Width, 0, b1->Width + stretched_width, b1->Height ), b2 ); b3->SaveToFile( "save.bmp" ); delete b1; delete b2; delete b3; あとはご自分の考える仕様に適合するように手直ししてください。
その他の回答 (2)
- KoHal
- ベストアンサー率60% (110/181)
No.2補足のソースコードはNo.1補足のトラブルが発生したソースコードですか? No.2補足のソースコードは取り立てて問題になる点はないようですが。 まぁ、 >map3->Canvas->StretchDraw( >TRect( map1->Width+10, 0, map1->Width + stretched_width, map1->Height ), map2); 2つの画像の間に10ピクセルのマージンをとりながらmap3の幅を補正してない、TRectの第3引数(map1->Width + stretched_width)を補正してない点が気になりますが。 これが原因で文字が崩れるのかな?
お礼
ご回答ありがとうございます。 No.2補足のソースコードはNo.1補足のトラブルが発生したソースコードですか? ⇒そうです。No2.の補足のソースコードはトラブルが発生したソースコードです。 ご指摘頂いた点を修正して確認しても同様の問題が発生しておりました・・・。 しかし、いろいろ試してみた結果以前は文字が表示された画像の方の幅を画像ファイルの幅に合わせていたのですが、文字が表示されている画像の幅を 固定にして行ったところ問題は解決しました。 とりあえずはこの方法で進めていくつもりです。 ありがとうございました。 いつも助けて頂き感謝しております。
- KoHal
- ベストアンサー率60% (110/181)
トラブルに関する質問は必ずソースコードを提示してください。ソースコードを見ないと何も分かりません。 No.1のサンプルソースで単純に1枚目と2枚目の画像を入れ替えた場合、画像の高さが同じであれば、連結後のサイズは変らないはずなんですが。
お礼
ご回答ありがとうございます。 連絡が遅くなりまして大変申し訳ございませんでした。 ご指摘頂いた通り下記に作成したソースコードを添付致します。 処理は2枚の画像を横に並べるのと縦に並べるの2パターンの処理を 行う関数を作成致しております。 もし問題がございましたらご教示お願い致します。 /*ここから作成した関数*/ void TForm3::image_data_uniting(Graphics::TBitmap *map1, Graphics::TBitmap *map2, Graphics::TBitmap *map3, int houkou) { int stretched_width; int stretched_height; if(houkou == 1) /* 横に並べる場合 */ { stretched_width = map1->Height == map2->Height ? map2->Width : map2->Width * map1->Height / map2->Height; map3->Height = map1->Height; map3->Width = map1->Width + stretched_width; map3->Canvas->Draw( 0, 0, map1 ); map3->Canvas->StretchDraw( TRect( map1->Width+10, 0, map1->Width + stretched_width, map1->Height ), map2); map3->SaveToFile("save.bmp"); } else /* 縦に並べる場合 */ { stretched_height = map1->Width == map2->Width ? map2->Height : map2->Height * map1->Width / map2->Width; map3->Width = map1->Width; map3->Height = map1->Height + stretched_height; map3->Canvas->Draw( 0, 0, map1 ); map3->Canvas->StretchDraw( TRect( 0, map1->Height+5, map1->Width, map1->Height+stretched_height), map2); map3->SaveToFile("save.bmp"); } } /*ここまで*/
補足
ご回答ありがとうございます。 教えて頂いた方法で横に並べて表示と縦に並べて表示が出来るようになりました。(この2つの表示をしたかったので) ありがとうございます。 操作をする上で1点わからない部分がありますのでもしご存知でしたら教えて下さい。 下記に例を交えて質問させて頂きます。 例: b1の画像サイズが幅1000、縦500 b2の画像サイズが幅200縦500(文字が表示されている画像) この画像を横に並べて表示する際、 (1)b1から先にb3に表示し、b2を表示した時 (2)b2から先にb3に表示し、b1を表示した時 (1)の場合保存した画像のb2に表示されている画像の文字列が殆ど見えない状態で保存されておりました。 (2)の場合保存した画像のb2の文字列は見える状態になっておりました。いったい何が原因なのかわからない状態です。 画像サイズは(1)の方が(2)より小さくなっておりました。 もしかしてそれが原因なのでしょうか? それを対処する方法は無いのでしょうか? 大変申し訳ございませんがよろしくお願い致します。