2

質問の説明:

ビットマップを JPEG 形式モードで JPEG ファイルに保存すると、Gdi 例外がスローされました。しかし、PNG形式モードで保存すると、正常に保存できます。

クイック再作成:

  1. ブラウザから画像を.jpgファイルに保存してください。ここをクリックしてください: IncorrectImageCorrectImage .(実際、このアプリケーションでは、その場で画像を要求し、画像を JPEG に保存します。)

  2. 以下のコードを使用して例外を確認します。

    string newFile = @"D:\Temp\newImage.jpg"; var newBitmap = Image.FromFile(@"D:\Temp\IncorrectImage.jpg"); newBitmap.Save(newFile,System.Drawing.Imaging.ImageFormat.Jpeg);

私が見つけたもの:

詳細な調査の結果、問題の原因は元の画像の[コメント] プロパティにあることがわかりました。プロパティ値を削除すると、エラーが消えます。さらに、画像のコメント値の値をメモ帳にコピーして貼り付けた後、画像を上部のコードで新しい画像に保存でき、画像のサイズも大きくなります! ここに画像の説明を入力

そのため、jpeg ファイルに保存するときに、コメント プロパティに機密性の高い文字または正しくない文字が含まれている可能性があると思います。それらのコメントについて私たちにいくつかの洞察を与えることができますか?

ありがとうございます。

もっと試してください:

以下のコードを試します:

        //foreach (var item in newBitmap.PropertyItems)
        //{
        //    if (item.Id == 37510)
        //    {
        //        item.Value = null;
        //        item.Len = 0;
        //    }
        //}
        newBitmap.RemovePropertyItem(37510);
        newBitmap.Save(newFile, System.Drawing.Imaging.ImageFormat.Jpeg);

プロパティ項目を削除すると、newimage を正常に保存できます。ただし、コメント アウト コードのように値を null に設定しただけでは、例外がスローされます。

私を助けてください:

  1. コメントをクリアしてから同じ値を貼り付けるだけで、画像サイズが大きくなるのはなぜですか(元のサイズは48k、カットアンドペーストすると約78kです)。バグの可能性はありますか?
  2. コメントをクリアしてから同じ値を貼り付けた後、画像を正常に保存できるのはなぜですか? いくつかの無効な文字をフィルターするクリップボードですか?
  3. コメント プロパティの値を null に設定しても画像を保存できないのはなぜですか? しかし、プロパティを削除すると、試す前のように機能しますか?

問題の根本原因を突き止めるお手伝いができれば幸いです。

4

1 に答える 1

1

MSDN http://social.msdn.microsoft.com/Forums/en-US/83b24aa5-511f-47cd-856a-4fbbb5688ddf/bitmap-save-jpeg-failed-but-pngから問題の原因を突き止めました。 -is-ok-because-of-the-comments-property

元のコメントは ASCII エンコーディングを使用しているようですが、GDI+ はそれを Unicode に自動変換します。コメントはすでに大きく、Unicode に変換するとサイズが 2 倍になり、EXIF ブロックの最大サイズ (64 k バイト) を超えています。

于 2013-07-24T11:07:08.013 に答える