VB6をVB.NET向けに変換

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の変換作業に詳しい方がいれば、ご助言をお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/09/10 23:00:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:Nivusys741

freemannさんへ

はい、PictureBoxです。

回答2件)

id:freemann No.1

回答回数335ベストアンサー獲得回数55

ポイント500pt

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# 画像/描画

id:taroe No.2

回答回数1099ベストアンサー獲得回数132

ポイント500pt

>Picture.Image.Save("c:\Picfolder\test.bmp") 

同じファイル名での上書き?使い回し?は避けて
ユニークなファイル名で作業ファイルを作成して

>Kill("c:\Picfolder\test.bmp") 

アプリケーションの開始と終了時に作業ファイルを削除するのが良いかと思います。
アプリケーション終了時に削除できないかどうかは試してみないとわかりかねますが
できない場合は、一部作業ファイルが残るのはあきらめるとかはどうでしょうか?

こういう構造にすれば、修正範囲は少なくて済みますし
動作確認のテストも簡単に済むので品質が保証できます。

  • id:freemann
    Picture.CreateGraphics
    での、Pictureとは、PictureBoxのインスタンスのことでしょうか?
    Picture1というのも見えるので、よくわからないのですが。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません