0
public void EditAndSave(String fileName) {
    Bitmap b = new Bitmap(fileName);
    /**
    * Edit bitmap b... draw stuff on it...
    **/
    b.Save(fileName); //<---------Error right here
    b.Dispose();
}

私のコードは上記のコードに似ています。開いたばかりのファイルを保存しようとすると、機能しません。別のパスで保存しようとすると、正常に動作します。ファイルがプログラムですでに開いているため、書き込みできない可能性がありますか?私はとても混乱しています。

4

3 に答える 3

1

あなたはそれがあなたのプログラムによってロックされているという点で正しいので、あなたはそれに書き込むことができません。Bitmapクラスのmsdn-page(http://msdn.microsoft.com/en-us/library/3135s427.aspx)で説明されています。

これを回避する1つの方法(頭のてっぺんから、もっと簡単な方法かもしれませんが)は、最初にイメージをメモリストリームにキャッシュし、そこからロードして、ファイルロックを閉じることができるようにすることです。

    static void Main(string[] args)
    {
        MemoryStream ms = new MemoryStream();
        using(FileStream fs = new FileStream(@"I:\tmp.jpg", FileMode.Open))
        {
            byte[] buffer = new byte[fs.Length];
            fs.Read(buffer, 0, buffer.Length);
            ms.Write(buffer, 0, buffer.Length);
        }

        Bitmap bitmap = new Bitmap(ms);

        // do stuff

        bitmap.Save(@"I:\tmp.jpg");
    }
于 2012-06-26T08:04:22.247 に答える
0

私はあなたとまったく同じ状況ではありませんでしたが、開いている画像ファイルが開いたままになるという問題がありました。

1つの提案は、を使用して画像をメモリにロードすることですBitmapCacheOption.OnLoad。この投稿に対する私の回答を参照してください:ロックされたリソース(画像ファイル)の管理

次に、編集後、FileStreamを使用してその画像を同じファイルに保存できます。これについては、たとえば、「BitmapImageをファイルに保存」で説明します。

それが最も簡単でエレガントな方法かどうかはわかりませんが、うまくいくはずです。

于 2012-06-26T07:49:24.313 に答える
0

実際、この例外が発生する理由はたくさんあります。

PixelFormat.Format16bppGrayScaleを使用している場合、GDI +ではサポートされておらず、示されている方法で失敗することに注意してください。適切な16ビットグレースケールを使用するための唯一の回避策はSystem.Windows.Media、WPFの新しい名前空間を使用することです。

于 2012-10-17T11:51:21.000 に答える