8
votes

Trouver le contenu d'une image de l'octet []

Y a-t-il un moyen de savoir ce que le contenu de l'image d'une image provenait uniquement des octets d'origine?

Pour le moment, j'ai une colonne de base de données qui stocke uniquement l'octet [], que j'utilise pour afficher une image sur une page Web. xxx

i peut bien sûr simplement simplement enregistrer le contenu dans une autre colonne de la table, mais je me demandais s'il y avait un autre moyen par exemple peut-être .NET a un moyen d'interroger les données pour obtenir le type.


0 commentaires

6 Réponses :


16
votes

2 commentaires

Acclamations pour le lien. J'ai fait des recherches, maintenant je sais quoi chercher et cela semble aller la voie à suivre.


J'ai mis une version de travail du code ci-dessous, en fonction de votre idée.



0
votes

fait le RawFormat travaux de propriété pour vous? XXX


2 commentaires

RawFormat semble fonctionner pour JPEG et GIF mais pas png. Pour un test, j'ai également essayé de le scoder à JPEG et cela a fonctionné le même (pour tous et non png), je suppose que .NET applique plus logique à PNG.


D'autres exemples, j'ai vu RAWFormat semble fonctionner uniquement lorsque l'image a été chargée à partir du système de fichiers et non créée via des octets (colonne DB).



1
votes

Il n'y a pas de moyen standard de détecter le type de contenu à partir d'un flux intégré .NET. Vous pouvez implémenter votre propre algorithme qui pourrait y parvenir à un des formats d'image bien connus en lisant le premiers d'octets et essayant de faire correspondre le format.


0 commentaires

14
votes

Les signatures de fichiers / magiques étaient la voie à suivre. Ci-dessous la version de travail du code.

ref: Stackoverflow - Obtenir des dimensions de l'image sans lire le fichier entier xxx

, puis la classe d'assistance: xxx


3 commentaires

Par curiosité, y a-t-il une raison pour laquelle vos boucles incrémentent avec "i + = 1" au lieu de "i ++"?


J'ai adapté le code d'une autre question / réponse Stackoverflow (mentionnée ci-dessus). Le code a depuis modifié comme je comprends aussi i ++ plus que i + = 1.


@Porman, styles personnels et préférences. Certaines personnes pensent que i ++ est plus claire, d'autres pensent que c'est moins "la meilleure pratique". Voir ceci: Stackoverflow .com / questions / 971312 / ...



7
votes

Ceci a fonctionné pour moi, MS CODE> EST LE MÉMOYSTREAM. L'inconvénient est qu'il doit charger l'image.

Dim fmt As System.Drawing.Imaging.ImageFormat
Dim content As String

Using bmp As New Drawing.Bitmap(ms)
    fmt = bmp.RawFormat
End Using

Select Case fmt.Guid
    Case Drawing.Imaging.ImageFormat.Bmp.Guid
        content = "image/x-ms-bmp"

    Case Drawing.Imaging.ImageFormat.Jpeg.Guid
        content = "image/jpeg"

    Case Drawing.Imaging.ImageFormat.Gif.Guid
        content = "image/gif"

    Case Drawing.Imaging.ImageFormat.Png.Guid
        content = "image/png"

    Case Else
        content = "application/octet-stream"

End Select


0 commentaires

3
votes

Réécrivez un peu la méthode de Nick Clarke à l'aide de LINQ:

public class Program
{
   public static void Main(string[] args)
   {
      byte[] byteArray = File.ReadAllBytes(@"C:/users/Alexander/image.jpg");
      ImagePartType type = byteArray.GetImageType();
   }
}


public static class ImageHelper
{
    public static ImagePartType GetImageType(this byte[] imageBytes)
    {
        foreach(var imageType in imageFormatDecoders)
        {
            if (imageType.Key.SequenceEqual(imageBytes.Take(imageType.Key.Length)))
                return imageType.Value;
        }

        throw new ArgumentException("Imagetype is unknown!");
    }

    private static Dictionary<byte[], ImagePartType> imageFormatDecoders 
                     = new Dictionary<byte[], ImagePartType>()
    {
       { new byte[]{ 0x42, 0x4D }, ImagePartType.Bmp},
       { new byte[]{ 0x47, 0x49, 0x46, 0x38, 0x37, 0x61 }, ImagePartType.Gif },
       { new byte[]{ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 }, ImagePartType.Gif },
       { new byte[]{ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }, ImagePartType.Png },
       { new byte[]{ 0xff, 0xd8 }, ImagePartType.Jpeg }
    };
}


0 commentaires