40

画像を読み込んで保存するときに何年にもわたって機能するコードを持っていると、このコードを壊す画像が1つあることがわかりました。

const string i1Path = @"c:\my\i1.jpg";
const string i2Path = @"c:\my\i2.jpg";

var i = Image.FromFile(i1Path);
i.Save(i2Path, ImageFormat.Jpeg);

例外は次のとおりです。

System.Runtime.InteropServices.ExternalException が発生しました

GDI+ で一般的なエラーが発生しました。

System.Drawing.Image.Save (文字列ファイル名、ImageCodecInfo エンコーダー、EncoderParameters encodingParams)
で System.Drawing.Image.Save (文字列ファイル名、ImageFormat 形式)
で ...

私が見る限り、画像に特別なものは何もありません。サイズは約 250 ピクセルで、Windows イメージ ビューアーや Paint.NET などで開くことができます。

ここに画像の説明を入力

(上記の画像は、Stack Overflow にアップロードされた後、エラーが発生しなくなったため、元の画像をここに配置しました)

私が発見したのは、Saveメソッドを呼び出すと、宛先イメージ ファイルがゼロ バイトで作成されていることです。

エラーの原因については本当にわかりません。

私の質問:

  • .NET がイメージを保存するのを妨げる特別なことが何か考えられますか?
  • この種のエラーを絞り込む方法は (パニック以外に) ありますか?
4

10 に答える 10

55

画像を保存するときにエラーが発生した正確な原因はまだわかりませんでしたが、適用する回避策を見つけました。

const string i1Path = @"c:\my\i1.jpg";
const string i2Path = @"c:\my\i2.jpg";

var i = Image.FromFile(i1Path);

var i2 = new Bitmap(i);
i2.Save(i2Path, ImageFormat.Jpeg);

つまり、イメージを内部的にインスタンスにコピーしBitmap、元のイメージの代わりにこのイメージを保存すると、エラーはなくなりました。

それをコピーすることで、元の呼び出しが失敗する原因となった誤った部分Saveが削除および/または正規化され、保存操作が成功すると想定しています。

保存された画像 i2.jpg

興味深いことに、このように保存されたイメージのディスク上のファイルは、元のソース (26 kB) よりも小さくなります (16 kB)。

于 2013-03-24T06:35:50.107 に答える
20

まず、目的のフォルダに読み取り/書き込み権限があることを確認してください。権限を変更すると、この問題が解決しました。

于 2014-02-16T05:50:33.887 に答える
9

解決策はここにあります。画像オブジェクトを破棄して、サーバー上のメモリを解放する必要があります。useusingステートメントを試してください。サーバー上の宛先ディレクトリも存在することを確認してください。

于 2014-04-28T12:53:38.567 に答える
5

画像が遅延して読み込まれ、保存しようとしたときに読み込みプロセスがまだ完了していないことが原因である可能性があります。

このブログ投稿で述べられていることに従うこと(質問でリンクした写真でドイツ人であると仮定) は、可能な解決策を提供します。また、この SO の質問の受け入れられた回答は、保存しようとしている画像ファイルがロックされていることが原因であることを示しています。

編集
Ulysses Alves については、リンクされたブログ エントリから: 使用して画像を読み込むと、Image.FromFile()破棄されるまでロックされたままになります。これにより、 への呼び出しが防止されSave()ます。

pictureBox1.Image = Image.FromFile("C:\\test\\test1.jpg");
pictureBox1.Image.Save("C:\\test\\test2.jpg");

上記のコードはエラーをスローします。

機能させるには、イメージをコピーする必要があります。次のコードが機能します。

pictureBox1.Image = Image.FromFile("C:\\test\\test1.jpg");
Image copy = pictureBox1.Image;
copy.Save("C:\\test\\test2.jpg")
于 2013-03-22T13:03:55.580 に答える
0

重要な情報:

// Using System.Drawing.Imaging:
new Bitmap(image).Save(memoryStream, ImageFormat.Jpeg);

イメージを保存するには、イメージをビットマップにキャストする必要があります。

使用:

// Using System.Drawing.Imaging:
image.Save(memoryStream, ImageFormat.Jpeg);

エラーをスローします:

画像保存時の一般的な GDI+ エラー

于 2019-04-24T05:40:31.680 に答える