2009-06-24 22 views
7

フォルダ内のイメージのサイズを変更するASP.NET C#ページがあります。これを行うにはGDI +を使用しています。イメージのサイズを変更し、私は既存の名前で保存しようとしているとき、Saveメソッドはエラーをスローしています。しかし、私は別の名前を与えるとsaved.But私は新しく作成されたサイズ変更された画像のために同じファイル名を持っています既存のファイルをサイズ変更された新しいファイルで上書きする必要があります。どんなアイデアを先に進めるか。 私のコードは、私が先ファイルの新しい名前を作成し、最初の行をコメント場合、ITは機能しませんC#:GDI +:ビットマップの保存方法を使用してイメージを上書きする

 oldImagePath= oldImagePath.Replace(".jpg", "NEW.jpg"); 

     try 
     { 
      ImageCodecInfo[] Info = ImageCodecInfo.GetImageEncoders(); 
      EncoderParameters Params = new EncoderParameters(1); 
      Params.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); 
      target.Save(oldImagePath, Info[1], Params); 
     } 

です。、他のは、それは私が同じ名前.ANY考えを持つようにしたいwill.But wose? ? ?事前に感謝します

答えて

11

最初に元のファイルを削除する必要があります。この区別をすることが重要です。つまり、.NETで画像操作を行っているときは、元の画像を読み取ってバイトが埋め込まれたメモリ内オブジェクトで作業しています。あなたは実際の元画像で作業していません。したがって、この全く新しいオブジェクト(既存のイメージからデータを使用する)を保存し、すでに使用中のパスを使用しようとすると、例外が発生します。

また、元のファイルがまだ開いていないことを確認する必要があります。操作しているImageオブジェクトを生成するために使用した元のファイルストリームを破棄してください。削除してから保存してください。

+0

多くは、私の国で起こる、それは最高のアイデアではありません。 – deadManN

18

あなたが次の行に

Image imgPhoto = Image.FromFile("myphoto.jpg"); 

を技術を使用してイメージをロードする場合、このファイルへのオープンハンドルを保持し、あなたがそれを上書きしようとするとそのファイルが現在使用中ではまだですので、あなたは、それに書き込むことはできません。

この問題を回避するには、ファイルをストリームにロードすると、画像情報がメモリに書き込まれたときにファイルハンドルが解放されたため、元のファイルを上書きすることができます。

は、次の方法でこれを行うことができますアウトライトの

FileStream fs = new FileStream("myphoto.jpg", FileMode.Open); 
Image imgPhoto = Image.FromStream(fs); 
fs.Close(); 
+0

http://msdn.microsoft.com/en-us/library/93z9ee4x(v=vs.110).aspx: "イメージの存続期間にストリームを開いたままにする必要があります。" – Tewr