VB6のシステムをVB.NETへ変換を行いました。
変換は無事に完了したんですが、画像を取り込む処理の細かな修正作業で苦戦しています。
下記処理を行うと、途中で左に示すエラーが出てしまいます。
・Kill("c:\Picfolder\test.bmp") → 別のプロセスが使用されているため、
"c:\Picfolder\test.bmp"にアクセスできません。
・Picture.Image.Save("c:\Picfolder\test.bmp") → 「GDI+で汎用エラーが発生しました。」
また.NETに対応してない箇所の修正を行っています。
色々なサイトを参考に修正を行っていますが、下記の記述で正しいでしょうか。
Dim g As Graphics = Picture.CreateGraphics
・Adjustment(Picture.hdc, X, Y) → Adjustment(g.GetHdc, X, Y)
・Picture.cls → g.Clear
・Picture.PaintPicture(Picture1.Image,X1,Y1,H1,W1,W1,X2,Y2,H2,W2)
→ g.DrawImage(Picture1.Image,X1,Y1,H1,W1,X2,Y2,H2,W2) //このままだとエラーが出る
※以下の内容は、どう修正したらいいか分からない
・Picture.AutoRedraw = True
・Picture.ScaleHeight
・Picture.ScalWidth
VB6→.NETの変換作業に詳しい方がいれば、ご助言をお願いいたします。
Killがうまくいかないのは、PictureBoxが画像を参照していたためだと思います。
回避方法はサンプルを見てください。
Picture.Image.Saveでエラーが出るのは、同じファイルに上書きで保存できないため。
次を参照してください。 Image.Save メソッド (String) (System.Drawing)
ExternalExceptionのところを見てください。
Public Class Form1 '削除のために画像の変数を作っておく Private img As Image Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '一旦変数に入れてから、PictureBoxに設定する img = Image.FromFile("e:\sample.jpg") Me.PictureBox1.Image = img End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click img.Save("e:\sample2.jpg") End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 'PictureBoxが参照しているために削除できないでいたので参照しないようにする Me.PictureBox1.Image = Nothing Me.PictureBox1.Refresh() '変数にしたのはこれをしたいがため。 '明示的にDisposeすることによって、参照していたのを強制的に解除する img.Dispose() Kill("e:\sample.jpg") End Sub End Class
Picture.CreateGraphicsで得られるハンドルは、PictureBox自身のもののためあまりよくないかと思います。
Bitmapのインスタンスなどを作成し、それに書き込むようにするほうがよいかと思います。
DrawImage()は次を参考にしてください。 Graphics.DrawImage メソッド (System.Drawing)
AutoRedrawはちょっとわかりませんでした。
ScaleHeightとScaleWidthについては、次のサイトの拡大縮小のあたりが参考になるのかなと思います。g.ScaleTransform()
緑のバイク ★ 初めてのC# 画像/描画
>Picture.Image.Save("c:\Picfolder\test.bmp")
同じファイル名での上書き?使い回し?は避けて
ユニークなファイル名で作業ファイルを作成して
>Kill("c:\Picfolder\test.bmp")
アプリケーションの開始と終了時に作業ファイルを削除するのが良いかと思います。
アプリケーション終了時に削除できないかどうかは試してみないとわかりかねますが
できない場合は、一部作業ファイルが残るのはあきらめるとかはどうでしょうか?
こういう構造にすれば、修正範囲は少なくて済みますし
動作確認のテストも簡単に済むので品質が保証できます。
コメント(1件)
での、Pictureとは、PictureBoxのインスタンスのことでしょうか?
Picture1というのも見えるので、よくわからないのですが。