tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルImageクラスで画像編集すると元の画像ファイルが削除できない
記事No11913
投稿日: 2017/10/05(Thu) 21:36
投稿者jikoryuu
Imageクラスで画像編集すると元の画像ファイルが削除できない

Dim oImage As Image = Image.FromFile("C:\Test\a.jpg")
Dim oSize As New Size(oImage.Width * 0.5, oImage.Height * 0.5)
oImage = oImage.GetThumbnailImage(oSize.Width, oSize.Height, Nothing, IntPtr.Zero)
oImage.Save("C:\Test\b.jpg", Imaging.ImageFormat.Jpeg)
oImage.Dispose()

ここで作成元のa.jpgを削除しようとすると
=======================================================================
vsHost32.exeによってファイルは開かれているため、操作を完了できません。
ファイルを閉じてから再実行してください。
a.jpg
=======================================================================
のダイアログが表示されファイルを削除できません。

以下のようだと問題なく削除できます。
Dim oImage As Image = Image.FromFile("C:\Test\a.jpg")
oImage.Save("C:\Test\b.jpg", Imaging.ImageFormat.Jpeg)
oImage.Dispose()

プログラムを終了させると元の画像ファイル(a.jpg)は削除できるようです。

どうすればプログラムを終了させずにサムネイル(画像編集?)しても
ファイルが削除できるようになるのか回避方法などありましたらご教授下さい。

[ツリー表示へ]
タイトルRe: Imageクラスで画像編集すると元の画像ファイルが削除できない
記事No11914
投稿日: 2017/10/05(Thu) 21:48
投稿者Hongliang
> Dim oImage As Image = Image.FromFile("C:\Test\a.jpg")
Image.FromFileでロードした場合、このインスタンスのDisposeを呼び出すまではファイルがロックされます。
が、
> oImage = oImage.GetThumbnailImage(oSize.Width, oSize.Height, Nothing, IntPtr.Zero)
ここで元のImageとは別のImageインスタンスをoImageに代入してしまっているため、元のImageインスタンスは触れなくなってしまっています。
> oImage.Dispose()
ここでDisposeしているのはGetThumbnailImageで取得したImageインスタンスであってFromFileでロードしたImageではありません。

GetThumbnailImageが返すImageオブジェクトはまた別の変数、例えばoImage2に代入し、oImage.Disposeを行った後であれば削除できるでしょう。
// もちろん、oImage2.Disposeも呼び出しましょう。

[ツリー表示へ]
タイトルRe^2: Imageクラスで画像編集すると元の画像ファイルが削除できない【解決】
記事No11915
投稿日: 2017/10/05(Thu) 22:17
投稿者jikoryuu
ご指摘の通りにしたら上手くいきました。
ズバリの回答ありがとうございます。
感謝感謝です。

[ツリー表示へ]