• ベストアンサー

C++Builder5で画像の結合

C++Builder5で複数の画像を1つの画像にして保存したいのですがそのような事は出来るのでしょうか? 画像の形式はbmpと考えております。

質問者が選んだベストアンサー

  • ベストアンサー
  • KoHal
  • ベストアンサー率60% (110/181)
回答No.1

できますよ。 ただし、画像の並べ方(縦、横、その他)、それぞれの画像のサイズが異なる場合の対処法(伸ばす縮める切取るその他)など考えなきゃならない点が色々ありますし、その仕様によって当然コードも変ってきます。 とりあえず、  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; あとはご自分の考える仕様に適合するように手直ししてください。

Simanohito
質問者

補足

ご回答ありがとうございます。 教えて頂いた方法で横に並べて表示と縦に並べて表示が出来るようになりました。(この2つの表示をしたかったので) ありがとうございます。 操作をする上で1点わからない部分がありますのでもしご存知でしたら教えて下さい。 下記に例を交えて質問させて頂きます。 例: b1の画像サイズが幅1000、縦500 b2の画像サイズが幅200縦500(文字が表示されている画像) この画像を横に並べて表示する際、 (1)b1から先にb3に表示し、b2を表示した時 (2)b2から先にb3に表示し、b1を表示した時 (1)の場合保存した画像のb2に表示されている画像の文字列が殆ど見えない状態で保存されておりました。 (2)の場合保存した画像のb2の文字列は見える状態になっておりました。いったい何が原因なのかわからない状態です。 画像サイズは(1)の方が(2)より小さくなっておりました。 もしかしてそれが原因なのでしょうか? それを対処する方法は無いのでしょうか? 大変申し訳ございませんがよろしくお願い致します。

その他の回答 (2)

  • KoHal
  • ベストアンサー率60% (110/181)
回答No.3

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)を補正してない点が気になりますが。 これが原因で文字が崩れるのかな?

Simanohito
質問者

お礼

ご回答ありがとうございます。 No.2補足のソースコードはNo.1補足のトラブルが発生したソースコードですか? ⇒そうです。No2.の補足のソースコードはトラブルが発生したソースコードです。 ご指摘頂いた点を修正して確認しても同様の問題が発生しておりました・・・。 しかし、いろいろ試してみた結果以前は文字が表示された画像の方の幅を画像ファイルの幅に合わせていたのですが、文字が表示されている画像の幅を 固定にして行ったところ問題は解決しました。 とりあえずはこの方法で進めていくつもりです。 ありがとうございました。 いつも助けて頂き感謝しております。

  • KoHal
  • ベストアンサー率60% (110/181)
回答No.2

トラブルに関する質問は必ずソースコードを提示してください。ソースコードを見ないと何も分かりません。 No.1のサンプルソースで単純に1枚目と2枚目の画像を入れ替えた場合、画像の高さが同じであれば、連結後のサイズは変らないはずなんですが。

Simanohito
質問者

お礼

ご回答ありがとうございます。 連絡が遅くなりまして大変申し訳ございませんでした。 ご指摘頂いた通り下記に作成したソースコードを添付致します。 処理は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"); } } /*ここまで*/

関連するQ&A

  • C++Builderで

    C++Builderで画像処理をしたいと思っています。 画像の拡大・縮小を連続的に行いたいのですが、利用できるライブラリとかあるのでしょうか?それともライブラリとか使わなくても出来るのでしょうか? サンプルプログラムのあるところのURLでも、何でもいいので、教えて下さい。

  • C++ Builderについて

    以前から、C言語、C++などをやっていて、最近になって、C++Builder(Version 5.0)を使ってみようと思いました。すこしいじってみたのですが、さまざまなことを簡単にできそうな気がしました。しかしながら、正直なところ分からないことだらけです。ネット上で初心者向けの本を購入したのですが、内容は薄く、自分が目的とするものに達するには十分ではありませんでした。探し方が悪いのか、本もさほど見つかりませんでした・・・・。 また、様々なサイトも見てみたのですが、やはりC++Builderの初歩的な使い方もいまいち分かっていないせいか、わけがわかりません。一応、購入した本で勉強しているのですが・・・・。 できることなら、初歩的なことから、詳しく様々なことが分かり易く載っている本等は無いでしょうか?C言語のときは、ぶ厚い本で勉強しました。そのような本もたくさんあったように思われます。C++Builderには無いのでしょうか?それともCやC++などをみっちりやらなければ、使えないって事なのでしょうか?

  • C++ Builder6 をふたたび動かしたい

    数年前まで C++ Builder6を使ってコマンドラインプログラムを作っていました。 久しぶりに使おうとすると、以下のエラーメッセージがでて新規プログラムが作れません。再インストールをしても同じです。 C++ 5.5 がフリーで出ているようなんですが、元のプログラムが複数あって、Builderの環境で使いたいと思うのです。 すでにボーランド社はありません。 どのようにすれば解決できるのかわかれば教えてください。よろしくお願いします。 C:\Program Files\Borland\CBuilder6\bin\bcb.$$$ から C:\Program Files\Borland\CBuilder6\bin\bcb.droに変更できません。

  • C++Builderでの文字化け

    C++BuilderのRichEditを使ってその内容をテキスト形式で保存したいのですが、 実際に保存されたファイルをメモ帳で見ると改行が■になって表示されてしまいます。 そのデータの内容はプログラムで RichEdit1->Text = "ほにゃらか\n"; と書くと'\n'のところがだめです。

  • C++Builder

    卒業研究で昨日からC++Builderを使うようになったのですが、まったくわかりません。 「慣れれば普通にプログラム作るより簡単だ」と教官はいいいますが… それで昨日課題が出ました。 C++Builderでサイコロを作成し、クリックすれば数字が変わる用にしろ との事。 ずっとやってるのですが…ランダムに数字を表示するのってどうゆうの使うんですか? …もぅ初歩的な質問ですいません… 穴があったら入りたい…

  • 個人でC++Builderを始めるには?

    質問に答えていたただいた方々、本当にありがとうございました。いろいろ考えてみたところ、C++Builderをやってみようかと思っています。 そこで、C++BuilderはPC屋さんに売ってあるのかという事と(昨日行ったらなかったもので…)、いくらくらいするものかということをお聞きしたく質問させてもらってます。またよろしくお願いします。

  • C++Builderの選択

     いつも勉強させていただいています。どうぞよろしくお願いします。  今手元にあるアプリ(C++Builder5.0のソースコード付き)をいじりたく、 これを機会に初めてC++の勉強をしたいのですが(経験のある言語は Fortran、VBです)、C++Builderのどれを購入するかで迷っております。  ポイントとしましては、 ・上のC++Builder5.0のコードがコンパイル可能なもの  (先日、無料のBorland C++Compiler5.5をダウンロードしてコンパイルを試みても  できませんでしたorz (vcl.hというファイルが足りないようです)が、  C++Builderであればバージョン違いでもコンパイルできるのでしょうか?) ・書籍が比較的多いもの。(調べているとC++Builder6は比較的多そうな?気がしたのですが。。。) ・今後も暫く使えそうなもの。(C++Builder5 Personalとかかなり安いようなのですが、  皆さんもっと新しいもので開発なされているという事でしょうか。。。?) ・¥は7~8万くらいまで?  PersonalとProfessionalの違いや制限もよく分からないので、 もしお詳しい方がいらっしゃいましたら、ぜひ教えていただければと思います。  どうぞよろしくお願いします。

  • C# 画像ファイルの更新

    C#を始めて2ヶ月余りの者です。 環境はW.7 C#.NET 2013です。 現在、以前C-Builderで作成したプログラムをC#に変換して居ます。 画像マスターを変更する所で、コンパイル出来なく成り、困って居ます。 やりたい事は、画像マスターがあり、これを表示して、マスターを変更したければカメラから読み込んだ画像を画像マスターに書き込むと言うものです。 C-Builderの時はBMPの読み書きは自分で作成しましたが、C#では関数があるので今回はこれを利用しました。 内容を簡略的に下に記述しました。AAAが画像マスターでBBBがカメラからの画像の代わりです。 ここで bmpSource1.Save(sCurDir + "\\BBB.bmp"); を実行すると、「別のプロセスで使用されているため、プロセスは ファイル~にアクセスできません。」とのエラーが表示されます。 良く考えてみれば、Readでオープンしている所に書き込もうとして居るのでエラーに成って当たり前ですので、bmpSource1 = new Bitmap(sCurDir + "\\AAA.bmp");の後に画像を別の場所に保存し、bmpSource1.Dispose();としてみた所、上手く行きませんでした。これもDisposeするのはバッファーであり、ファイルでは無いから当たり前かも知れません。 ネットで色々探して居る時に、何かのパラメーターでReadWriteモードの所を見つけましたが、bmpSource1 = new Bitmap(sCurDir + "\\AAA.bmp");には指定するパラメーターが見当たりませんでした。 何方か、画像ファイルの更新方法がお分かりに成る方、ご教授下さい。 よろしくお願い致します。 String sCurDir = System.IO.Directory.GetCurrentDirectory(); Bitmap bmpSource1; Bitmap bmpSource2; public Form1() { InitializeComponent(); pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; bmpSource1 = new Bitmap(sCurDir + "\\AAA.bmp"); bmpSource2 = new Bitmap(sCurDir + "\\BBB.bmp"); pictureBox1.Image = bmpSource1; bmpSource2.Save(sCurDir + "\\AAA.bmp"); <-ここで実行時エラー }

  • C++ Builder XE

    C++ Builder XEでBitmapの上に文字を書こうとしていますが例えば bmp->Canvas->FillText(rect, "Are you?", false, 100, TFillTextFlags() << TFillTextFlag::RightToLeft, TTextAlign::Center, TTextAlign::Center); と書くと「Are you?」と表示されて欲しいのに「?Are you」と表示されてしまいます。 解決方法を知っているかたがいましたら教えてください。

  • C++ Builder6について

    c++ builder6でMemo1 などに入力した値をポインタに格納したいんですが、やり方がうまくいかず、いろいろ試してみても出来ません。どなたか方法を教えてくださいませんか?

専門家に質問してみよう