質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

6638閲覧

picturebox上にLabelコントロールとpictureboxコントロールを張り付けて画像を保存させたい

frmcteam

総合スコア8

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2018/04/06 11:57

編集2018/04/07 10:33

現在picturebox上にExpicturebox(線の描画ができるpicturebox)を合成できるようなコードを入力できました。ここまでは想像通りで行っています。問題なのは、ここからLabelコントロールとpictureboxコントロールを張り付けて保存させたいのです。(=合成したい)ちなみに、そのLabelコントロールとpictureboxコントロールは、動的に作成(コードで生成)したもので、何個でも作成できるようなシステムです。なんとか張り付けるところまではできましたが、根本的な何かが間違っているのか、pictureboxコントロールは一個しか合成されず、位置もも右下の端に表示されてしまいます。Labelコントロールは張り付けることができません。。。これをなんとかして合成させて画像の保存まで行きたいです。以下のコードは、親pictureboxと親Expictureboxを合成して保存し、Labelコントロールとpictureboxコントロールを張り付ける前のコードです。
※VS2015、VB.NET、windows10で作成しています。

Dim img1 As Bitmap = New Bitmap(PictureBox2.Image) Dim img2 As Bitmap = New Bitmap(ExPictureBox1.Image) Dim img3 As Bitmap = New Bitmap(img1) Dim g As Graphics = Graphics.FromImage(img3) Dim sfd As New SaveFileDialog() sfd.FileName = "路線図.png" sfd.InitialDirectory = "ピクチャ" sfd.Filter = "画像(*.png;)|*.png;|すべてのファイル(*.*)|*.*" sfd.FilterIndex = 1 sfd.Title = "保存先のファイルを選択してください" sfd.RestoreDirectory = True sfd.OverwritePrompt = True sfd.CheckPathExists = True If sfd.ShowDialog() = DialogResult.OK Then Console.WriteLine(sfd.FileName) End If g.DrawImage(img2, img3.Width - img2.Width, img3.Height - img2.Height, img2.Width, img2.Height) img3.Save(sfd.FileName)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kenshirou

2018/04/07 03:46

「imageは一個しか合成されず」とありますが、提示コードでいう所の「合成されなかったimage」とはどれに当たるのでしょうか?また、Labelとは何でしょうか?Labelコントロール?
frmcteam

2018/04/07 10:29

「合成されなかったimage」は、本来コントロールを動かし保存するためのはずが、コントロールを動かしたはずのimageが全て左下に表示されてしまうことです。LabelはLabelコントロールです。こちらも動かせるコントロールにしてあります。
frmcteam

2018/04/07 11:11

はい…今のところ解決はしていません
退会済みユーザー

退会済みユーザー

2018/04/07 13:34

マルチポストという言葉を知ってますか? 知らなかったらその言葉をキーワードにググってヒットする記事を 2, 3 読んでください。歓迎されることはないということが分かるはず。
guest

回答1

0

ベストアンサー

提示コードの内のg.DrawImageメソッドでは、このオーバーロードの引数は、
(描画イメージ, 描画位置x座標, 描画位置y座標, 描画幅, 描画高さ)です。

しかし、提示コードでは、この引数の描画位置x座標とy座標の値に、
ベース画像と描画したい画像との幅・高さの差を与えています。
このため、描画される画像の位置はベース画像上の右下になるのは当然のことです。
g.DrawImageメソッドの描画位置x座標とy座標の引数には、
あなたが描画したい位置を指定してください。

もしかして、Formに親Pictureboxがあり、
その上に複数の子Pictureboxと複数のLabelがあり、
メインのPictureboxの画像上に子Pictureboxの画像とLabelの内容を加えた画像を
新たに作成し、保存したい、ということでしょうか?

その場合、子Pictureboxの画像を描画するならば、
g.DrawImageメソッドの描画位置x座標とy座標の引数には、
親Pictureboxを基準とした子Pictureboxの座標を渡してあげればいいです。

複数の子Pictureboxの画像を反映させたいのであれば、これを繰り返せばいいわけです。
ただし、子Picturebox上にオーナードローで描画したイメージ(Picturebox.Imageに含まれないイメージ)は
別途描画する必要があります。

あと、Labelですが、画像にLabelの内容を合成させたいのであれば、
g.DrawStringメソッドを使った方が早いでしょう。
以下を参考にしてください。

https://msdn.microsoft.com/ja-jp/library/system.drawing.graphics.drawstring(v=vs.110).aspx

例えば、引数のFontはLabelのFontを使えばいいでしょうし、
描画範囲は、子Pictureboxの時と同様、親Pictureboxを基準とした位置を考慮すればよいでしょう(g.DrawStringの位置等引数はInt32ではなくSingleであることに注意)。

投稿2018/04/07 04:25

kenshirou

総合スコア772

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問