web-dev-qa-db-ja.com

Image.Save()は「値をnullにすることはできません。/r/nParametername:encoder」という例外をスローします

RawFormatを使用してビットマップイメージを保存しているときに、「値をnullにすることはできません。\ r\nパラメータ名:エンコーダ」エラーが表示されます。サンプルコード:

_class Program
{
    static void Main(string[] args)
    {
        try
        {
            var image = new System.Drawing.Bitmap(500, 400);
            var stream = new MemoryStream();
            image.Save(stream, image.RawFormat);
        }
        catch (Exception exp)
        {
            Console.WriteLine(exp.ToString());
        }
    }
}
_

以下のコードはnullを返すため、RawFormatはImageEncoderの既存のリストに存在しません。

var imageCodecInfo = ImageCodecInfo.GetImageEncoders().FirstOrDefault(codec => codec.FormatID == image.RawFormat.Guid);

注:画像は任意のタイプ(JPEG、BMP、PNG)などです。Image.Save()はimage.RawFormatで動作するはずです。 RawFormatはビットマップタイプではありません。 image.RawFormatをImageFormat.Bmpに変更すると、保存操作は成功します。

以下のリンクを参照しましたが、画像タイプに依存しないようにするものは見つかりませんでした。

Image.Saveクラッシュ:{"値をnullにすることはできません。\ r\nパラメータ名:エンコーダー"}Image.Save(Stream、ImageFormat)が例外をスローする理由

どんな提案でも大歓迎です。

31

ディスクからイメージをロードする場合、image.RawFormatを使用して、元の形式を使用してそのイメージを保存できます。ただし、メモリ内ビットマップに関連付けられたエンコーダーはありません(このサンプルアプリケーションで作成しているものです)。そのため、ユーザー自身で画像形式を指定する必要があります(例:ImageFormat.Bmp)。

45
C.Evenhuis

これを使用でき、修正されます:

image.Save(stream,ImageFormat.Jpeg);
6
Eric