2011-07-28 15 views
1

私はthis questionのように、.jpgsに.pngsのバッチを変換しようとしている:なぜ私のコードはGDI +で一般的なエラーをスローしますか?

For Each file As String In Directory.EnumerateFiles(path).Where(Function(s) s.EndsWith(".png")) 
    Dim newfile As String = IO.Path.Combine(newpath, IO.Path.GetFileNameWithoutExtension(file) & ".jpg") 
    Using png As Bitmap = Bitmap.FromFile(file) 
     Using jpg As New Bitmap(png.Width, png.Height) 
      Using g As Graphics = Graphics.FromImage(jpg) 
       g.Clear(Color.FromArgb(255, 212, 208, 200)) 
       g.DrawImageUnscaled(png, 0, 0) 
       jpg.Save(newfile, ImageFormat.Jpeg) 
      End Using 
     End Using 
    End Using 
Next 

jpg.Saveへの呼び出しは、しかし、GDI +で「一般的なエラー」と。もともと内側のUsingステートメントの外側では、私はthis answerとして内向きに移動しましたが、何も変更されませんでした。私はnewfileに有効なパスが含まれていること、そしてプログラムにディレクトリへの書き込みアクセス権があることを確認しました。私は何が欠けていますか?

答えて

0

ファイルパスについて確信していると言われていますが、ここではnewfileに渡して、IO.Path.Combineにnull値が設定されていることがわかります。 は、私はちょうどPath文字列でnewfile文字列を初期化し、何の問題もなく正常にコードを実行します。

Dim newfile As String = Path 
newfile = IO.Path.Combine(newpath, IO.Path.GetFileNameWithoutExtension(file) & ".jpg") 
+0

'newpath'は定数(異なる)ディレクトリで、' newfile'ではなく 'IO.Path.Combine'に渡されます。 – dlras2

+0

@ダン:私は、 'newfile'で問題が発生しているのを見て、私を信じています。あなたはコードをテストすることができます。 'newpath'を' path'に置き換えるだけで、新しい 'jepg'ファイルが' Path'ディレクトリと同じディレクトリに追加されます。 –

+0

@Dan: 'Path.Combine'は結合する文字列によって異なる動作をします。たとえば、 "C:\ testing \"と '' tested \ "を組み合わせると、' 'C:\ testing \ ''と '' testing \ "'と異なる文字列が得られます。 '" \ "'を文字列に... –

0

私はあなたのコードを試してみた(C#で書き直す)と一つのことを発見しました:例外があなたの場合のみ発生新しいイメージをPNGをリストしているのと同じディレクトリに保存してください。イメージを別のディレクトリに書き込むようにコードを変更すると、コードは問題なく動作します。

なぜこれが起こっているのか説明することはできません(おそらくBitmap.FromFile()は何とかディレクトリをロックしています)。多くのGDI + Bitmapの癖があります。

がところで:

For Each file As String In Directory.EnumerateFiles(path).Where(Function(s) s.EndsWith(".png")) 
    Dim newfile As String = IO.Path.Combine(newpath, IO.Path.GetFileNameWithoutExtension(file) & ".jpg") 
    Using jpg As New Bitmap(png.Width, png.Height) 
     Using g As Graphics = Graphics.FromImage(jpg) 
      Using png As Bitmap = Bitmap.FromFile(file) 
       g.Clear(Color.FromArgb(255, 212, 208, 200)) 
       g.DrawImageUnscaled(png, 0, 0) 
      End Using 

      jpg.Save(newfile, ImageFormat.Jpeg) 
     End Using 
    End Using 
Next 
:それは例外をスローしないように私はC#のコードを手直しするために管理し、私は類似した方法(私もVBのコードをテストしていない)であなたのVBスニペットを書き換えます

うまくいきます。

関連する問題