4

ファイルからビットマップ イメージを読み込んでいました。イメージを別のファイルに保存しようとすると、「GDI+ で一般的なエラーが発生しました」というエラーが表示されました。これは、ファイルが画像オブジェクトによってロックされているためだと思います。

わかりましたので、Image.Clone 関数を呼び出してみました。これでもファイルはロックされます。

うーん。次に、FileStream からビットマップ イメージを読み込んで、そのイメージをメモリに読み込んで、GDI+ がファイルをロックしないようにします。これは、メモリ不足の例外をスローする Image.GetThumbnailImage メソッドを使用してサムネイルを生成する必要があることを除いて、うまく機能します。どうやら、この例外を停止するにはストリームを開いたままにしておく必要がありますが、ストリームを開いたままにしておくと、ファイルはロックされたままになります。

だからその方法はダメ。最後に、ファイルのコピーを作成しました。これで、ファイルの 2 つのバージョンができました。1 C# プログラムでロックして操作できます。この別の元のファイルはロックされていないままで、変更を保存できます。これには、変更できないファイルのコピーを操作しているため、変更を保存した後でも変更を元に戻すことができるという利点があります。

確かに、2 つのバージョンのイメージ ファイルを持たなくても、これを達成するためのより良い方法があります。何か案は?

4

3 に答える 3

2

それ以来、ファイルをロックせずにイメージを複製する別の方法を見つけました。Bob Powell はそのすべてに加えて、より多くの GDI リソースを持っています

      //open the file
      Image i = Image.FromFile(path);

      //create temporary
      Image t=new Bitmap(i.Width,i.Height);

      //get graphics
      Graphics g=Graphics.FromImage(t);

      //copy original
      g.DrawImage(i,0,0);

      //close original
      i.Dispose();

      //Can now save
      t.Save(path)
于 2008-11-04T14:20:58.300 に答える
2

Well if you're looking for other ways to do what you're asking, I reckon it should work to create a MemoryStream, and read out the FileStream to it, and load the Image from that stream...

var stream = new FileStream("original-image", FileMode.Open);
var bufr = new byte[stream.Length];
stream.Read(bufr, 0, (int)stream.Length);
stream.Dispose();

var memstream = new MemoryStream(bufr);
var image = Image.FromStream(memstream);

Or something prettier to that extent.

Whether or not that's the way you should go about solving that problem, I don't know. :) I've had a similar problem and wound up fixing it like this.

于 2008-10-31T13:37:11.900 に答える
1

同様の問題がありました。しかし、画像をビットマップファイルとして保存することはわかっていました。だから私はこれをしました:

    public void SaveHeightmap(string path)
    {
        if (File.Exists(path))
        {
            Bitmap bitmap = new Bitmap(image); //create bitmap from image
            image.Dispose(); //delete image, so the file

            bitmap.Save(path); //save bitmap

            image = (Image) bitmap; //recreate image from bitmap
        }
        else
            //...
    }

確かに、それは最善の方法ではありませんが、うまくいきます:-)

于 2015-03-11T10:21:32.827 に答える