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. p> 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. p> p>
6 Réponses :
Consultez ce Table de signatures de fichier . P>
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.
fait le RawFormat code >
travaux de propriété pour vous?
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).
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. p>
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 p> , puis la classe d'assistance: p>
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 ++ code> est plus claire, d'autres pensent que c'est moins "la meilleure pratique". Voir ceci: Stackoverflow .com / questions / 971312 / ...
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
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 } }; }