2010-11-26 8 views
10

Image.Save(MemoryStream, ImageFormat)を呼び出すときにこのコードが失敗します。System.Drawing.Image.RawFormatからImageFormatを取得

する価値がnull.Parameter名にすることはできません:

は、私は例外を取得。エンコーダー」私が直接、例えばImageFormat.JpegImageFormatオブジェクトを渡す場合、それは動作します

ImageFormat format = generatedImage.RawFormat as ImageFormat; 
image.ImageData = generatedImage.Save(format); 

rawformatImageFormatに変換する最適な方法は何ですか(スイッチステートメントがないのが理想的です)またはたくさんのif文の)

おかげ ベン

答えて

8

ごめんなさい、私が直接解析または生成された画像オブジェクトから「適切な」ImageFormatを抽出するいかなる可能性が見つかりませんでした。

これは私のコードですが、mimetypeの代わりに静的なImageFormatメンバーを格納することでそれを採用することができます。

   if (image.RawFormat.Equals(ImageFormat.Jpeg)) 
        binary.MetaInfo.Mimetype = "image/jpeg"; 
       else if (image.RawFormat.Equals(ImageFormat.Bmp)) 
        binary.MetaInfo.Mimetype = "image/bmp"; 
       else if (image.RawFormat.Equals(ImageFormat.Emf)) 
        binary.MetaInfo.Mimetype = "image/emf"; 
       else if (image.RawFormat.Equals(ImageFormat.Exif)) 
        binary.MetaInfo.Mimetype = "image/exif"; 
       else if (image.RawFormat.Equals(ImageFormat.Gif)) 
        binary.MetaInfo.Mimetype = "image/gif"; 
       else if (image.RawFormat.Equals(ImageFormat.Icon)) 
        binary.MetaInfo.Mimetype = "image/icon"; 
       else if (image.RawFormat.Equals(ImageFormat.Png)) 
        binary.MetaInfo.Mimetype = "image/png"; 
       else if (image.RawFormat.Equals(ImageFormat.Tiff)) 
        binary.MetaInfo.Mimetype = "image/tiff"; 
       else if (image.RawFormat.Equals(ImageFormat.Wmf)) 
        binary.MetaInfo.Mimetype = "image/wmf"; 

あなたは、静的なImageFormatのメンバーの配列を使用することによって、それを片付けることができ、私はあなたがスイッチまたはループを避けることはできないと思います。私は同じためヘプラー方法に従って使用し

敬具、マティアス

+0

.jpgのために何をすべきですか? – Elnaz

15

public static string GetMimeType(Image i) 
{ 
    var imgguid = i.RawFormat.Guid; 
    foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageDecoders()) 
    { 
     if (codec.FormatID == imgguid) 
      return codec.MimeType; 
    } 
    return "image/unknown"; 
} 
+0

これは質問に対する答えではありませんが、大規模なswitch/ifステートメントを避ける非常に良い方法です。 –

+0

あまりにも私のために働いた!私は単純な画像サイズ変更タスクのためにVB.NETに翻訳しました。誰かがそれを望む場合に備えて、それを答えとして追加します。 – BoffinbraiN

5

あなたはこのを探していますか?


System.Drawing.Imaging.ImageFormat fmt = new System.Drawing.Imaging.ImageFormat(generatedImage.RawFormat.Guid); 
0

Cheburekの答えのVB.NETの翻訳:

Private Function GetMimeType(i As Drawing.Image) As String 
    Dim imgguid As Guid = i.RawFormat.Guid 
    For Each codec As ImageCodecInfo In ImageCodecInfo.GetImageDecoders() 
     If (codec.FormatID = imgguid) Then 
      Return codec.MimeType 
     End If 
    Next 
    Return "image/unknown" 
End Function 
0

私は、GUIDを比較するCheburek方法を試してみました。一部のPNG画像では、guidが一致しませんでした。だから私はMatthias Wuttkeの解法とCheburekの解法の両方を使うロジックを書く必要がありました。

私はImageCodecinfoで確認していましたが、コードがimageformatを見つけられなかった場合は、Matthias Wuttkeのソリューションを使用して画像フォーマットを比較しました。

上記のソリューションの両方が失敗した場合は、ファイルのMIMEタイプを取得するために拡張メソッドを使用..

MIMEタイプが変更された場合、そのファイルも変化する、我々はと一致するように、ダウンロードしたファイルのチェックサムを計算しました。サーバー上の元のファイルのチェックサム。私たちにとっては、出力として適切なファイルを取得するためにはインポートが必要でした。

関連する問題