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

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

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

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

Q&A

解決済

1回答

9606閲覧

GDI+ で汎用エラーが発生しました。

sake

総合スコア57

VB.NET

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

0グッド

0クリップ

投稿2021/11/17 05:50

画像の合成をしています。
1回目は問題なく合成できました。
しかし、2回目は「GDI+ で汎用エラーが発生しました。」というエラーが発生してしまいます。
念のため、該当するファイルを削除しようとしたら、「vshost32.exeによってファイルは開かれているため、操作を完了できません。ファイルを閉じてから再実行してください。」というメッセージがでます。
このファイルを閉じる方法を教えてください。
イメージ説明
1回目で合成した画像
イメージ説明
2回目に合成しようとしたら、このエラーが出ました
イメージ説明
該当ファイルを削除しようとしたら出たメッセージ

VB.NET

1FileName = DirName & "\" & System.IO.Path.GetFileNameWithoutExtension(TextBox3.Text) & ".jpg" 2Using Jpeg As Bitmap = FormUtil.CreateClientBitmap(Me, New Rectangle(709, 158, 435, 370)) 3 Jpeg.Save(FileName, Imaging.ImageFormat.Jpeg) 4 Dim g As Graphics = Graphics.FromImage(PictureBox2.Image) 5 Dim img As New Bitmap(FileName) 6 Dim srcRect As New Rectangle(0, 0, 435, 376) 7 Dim desRect As New Rectangle(TextBox13.Text, TextBox14.Text, 435 * (TextBox15.Text / 100), 376 * (TextBox15.Text / 100)) 8 '画像の一部を描画する 9 g.DrawImage(img, desRect, srcRect, GraphicsUnit.Pixel) 10 g.Dispose() 11 PictureBox2.Invalidate() 12 FileName = DirName & "\Test" & System.IO.Path.GetFileNameWithoutExtension(TextBox3.Text) & ".jpg" 13 PictureBox2.Image.Save(FileName, Imaging.ImageFormat.Jpeg) 14End Using

インターネットのサイトを探しましたが、思うようなサイトが見つかりません。
何方か、お力添えお願いします。

環境
Windows 10
Microsoft Visual Studio 2010

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

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

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

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

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

KOZ6.0

2021/11/17 06:32 編集

Dim img As New Bitmap(FileName) が Dispose されていないですね g.DrawImage(img, desRect, srcRect, GraphicsUnit.Pixel) ここは Jpeg で良いのでは?
sake

2021/11/17 07:30

早速の回答、ありがとうございました。 img.Dispose() で解決しました。 追加の質問で申し訳ありませんが、教えてください。 合成したときに直前の画像の上に上書きされてしまいます。 直前の画像データをクリアしてから合成することは可能でしょうか? 色々と甘えてしまい、申し訳ありませんがよろしくお願いします。
KOZ6.0

2021/11/17 08:22

最初の背景画像を保存しておいて、再度合成すれば良いです。 PictureBox2.Image = DirectCast(BackBmp.Clone, Bitmap) (合成処理)
KOZ6.0

2021/11/17 08:39

Clone すると、リソースが増えるので、背景画像を描画したほうがいいですね。
sake

2021/11/18 02:55

ご指摘のように、一旦 PictureBox2.ImageLocation = Nothing PictureBox2.ImageLocation = TextBox3.Text として、合成処理をしましたが、 Dim g As Graphics = Graphics.FromImage(PictureBox2.Image) のところで、「NULL値を入れることは出来ません」というメッセージがでました。 どのようにしたらPictureBox2に新しいソースを読み込むことができますか? VB.NETを使い始めて間もないので、色々分からない事ばかりです。 よろしくお願いします。
guest

回答1

0

ベストアンサー

質問に関しての回答ですが、New Bitmap(fileName) とすると、Bitmap オブジェクトがファイルを開きっぱなしにするので書き込みがエラーになります。
Dispose すると解放されるので書き込み可能になります。

追加の質問については以下回答します。

(1) まず Form のフィールドとして

VB

1Private BackBmp As Image

を宣言します。

(2) Form_Load では、PictureBox2.Image に、空のビットマップを割り当てます。

VB

1Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 2 Dim cs As Size = PictureBox2.ClientSize 3 PictureBox2.Image = New Bitmap(cs.Width, cs.Height) 4End Sub

(3) 画像の取り込みは、読み込んだビットマップを (1) のフィールドに格納し、Picture2.Image に描画します。

VB

1Private Sub LoadBitmap() 2 Using stream As New IO.StreamReader(TextBox3.Text) 3 If BackBmp IsNot Nothing Then 4 BackBmp.Dispose() 5 End If 6 BackBmp = Image.FromStream(stream.BaseStream) 7 End Using 8 Using g As Graphics = Graphics.FromImage(PictureBox2.Image) 9 g.Clear(SystemColors.Control) 10 g.DrawImage(BackBmp, 0, 0) 11 End Using 12 PictureBox2.Invalidate() 13End Sub

(4) 合成処理は、(1) に格納したビットマップを Picture2.Image に描画してから行います。

VB

1Private Sub CombineImage() 2 Using g As Graphics = Graphics.FromImage(PictureBox2.Image) 3 g.Clear(SystemColors.Control) 4 g.DrawImage(BackBmp, 0, 0) 5 6 '合成処理 7 8 End Using 9 PictureBox2.Invalidate() 10End Sub

以上です。

投稿2021/11/18 03:56

KOZ6.0

総合スコア2707

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

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

sake

2021/11/18 16:17

ありがとうございました。 わざわざ丁寧なモジュールを付けて頂いて、大変助かりました。 またお世話になる機会があると思いますが、その節もよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問