11
votes

Obtenir imageFormat à partir de system.drawing.image.rawformat

Ce code échoue lorsque vous essayez d'appeler image.Save (MemoryStream, imageFormat) .

Je reçois l'exception:

Une valeur ne peut pas être null.paramètre Nom: encodeur " xxx

Ça fonctionne si je passe dans un imageFormat objet directement. imageformat.jpeg .

Quelle est la meilleure façon de convertir le RAWFormat à imageFormat (idéalement sans instruction de commutateur ou Beaucoup de déclarations si)

merci BEN


0 commentaires

8 Réponses :


11
votes

Je suis désolé, je n'ai trouvé aucune possibilité d'extraire directement un "bon" imageFormat de l'objet image analysé ou généré.

Ceci est mon code, vous pouvez l'adopter en stockant le membre statique imageFormat au lieu du MIMETYPE . P>

                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";


0 commentaires

17
votes

J'utilise la méthode Hepler suivant pour la même chose:

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";
}


2 commentaires

Bien que cela ne soit pas une réponse à la question, c'est une très bonne façon d'éviter des déclarations de grossieurs / si.


Travaillé pour moi aussi! Je l'ai traduite à vb.net pour une tâche de redimensionnement d'image simple. J'ajouterai cela comme une réponse au cas où quelqu'un le souhaite.



7
votes

cherchez-vous cela? XXX


0 commentaires

1
votes

Il y a aussi un moyen de sauvegarder une image code> dans son RawFormat code> à un flux code>. Voir http: // bytes.com/topic/c-shanf/answers/944402-how-access-raw-image-data-resource-file#post3733044

pour moi qui fonctionne comme ce qui suit: P>

byte[] GetRawImageData(Image img)
{
    using(MemoryStream ms = new MemoryStream())
    {
        img.Save(ms, img.RawFormat);
        return ms.ToArray();
    }
}


0 commentaires

0
votes

La traduction VB.net de la réponse de Cheudurek:

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 commentaires

0
votes

J'ai essayé la méthode de Cheburek de comparer le GUID. Mais pour certaines des images PNG, les GUDS ne correspondaient pas. Je devais donc écrire une logique qui utilisera les deux méthodes mentionnées par la solution de Matthias Wutttke et la solution de Cheburek.

D'abord, je vérifiais avec l'imagecodecinfo et si le code ne trouve pas l'imageFormat, j'ai comparé l'imageFormat à l'aide de la solution de Matthias Wutttke.

Si la solution mentionnée ci-dessus a échoué, utilisez la méthode de l'extension pour obtenir le type de fichier MIME.

Si le type MIME change alors, le fichier change également, nous calculions la checksum de fichiers téléchargés pour correspondre à la checksum du fichier d'origine sur le serveur .. donc pour nous, il était important d'obtenir un fichier approprié comme sortie.


0 commentaires

1
votes

La réponse de Cesare impériali ci-dessus a fonctionné dans mes tests. Le seul inconvénient (si cela compte) est que le .tostring () pour un retour JPEG revient »[ImageFormat: B96B3CAE-0728-11D3-9D7B-0000F81EF32E]« Au lieu de «JPEG».

Si cela vous importe, un manière que vous puissiez obtenir le code statique précis avec moins de code est de cette façon: xxx


0 commentaires

0
votes

Une réponse fraîche, moderne et générale pour trouver une extension d'image de RawFormat et la sauvegarde est comme ceci:

var formatDescription = ImageCodecInfo.GetImageDecoders().FirstOrDefault(w => w.FormatID == image.RawFormat.Guid)?.FormatDescription;

filePath = Path.ChangeExtension(filePath, formatDescription);

image.Save(filePath);


0 commentaires