Existe-t-il un moyen peu coûteux d'obtenir les dimensions d'une image (jpg, png, ...)? De préférence, j'aimerais y parvenir en utilisant uniquement la bibliothèque de classes standard (en raison des restrictions d'hébergement). Je sais qu'il devrait être relativement facile de lire l'en-tête de l'image et de l'analyser moi-même, mais il semble que quelque chose comme ça devrait déjà être là. De plus, j'ai vérifié que le morceau de code suivant lit l'image entière (ce que je ne veux pas):
using System;
using System.Drawing;
namespace Test
{
class Program
{
static void Main(string[] args)
{
Image img = new Bitmap("test.png");
System.Console.WriteLine(img.Width + " x " + img.Height);
}
}
}
c#
.net
image
image-manipulation
Jan Zich
la source
la source
Réponses:
Votre meilleur pari, comme toujours, est de trouver une bibliothèque bien testée. Cependant, vous avez dit que c'était difficile, alors voici un code douteux en grande partie non testé qui devrait fonctionner dans un bon nombre de cas:
Espérons que le code est assez évident. Pour ajouter un nouveau format de fichier, vous l'ajoutez
imageFormatDecoders
avec la clé étant un tableau des "bits magiques" qui apparaissent au début de chaque fichier du format donné et la valeur étant une fonction qui extrait la taille du flux. La plupart des formats sont assez simples, le seul vrai stinker est jpeg.la source
throw e;
mais simplement à lathrow;
place. Vos commentaires de doc XML sur le secondGetDimensions
montrent également à lapath
place debinaryReader
le
validateImageData
jeufalse
empêche GDI + d'effectuer une analyse coûteuse des données d'image, réduisant ainsi considérablement le temps de chargement. Cette question éclaire davantage le sujet.la source
new Bitmap()
.Avez-vous essayé d'utiliser les classes WPF Imaging?
System.Windows.Media.Imaging.BitmapDecoder
, etc.?Je pense qu'un effort a été fait pour s'assurer que ces codecs lisent uniquement un sous-ensemble du fichier afin de déterminer les informations d'en-tête. Ça vaut un chèque.
la source
Je cherchais quelque chose de similaire quelques mois plus tôt. Je voulais lire le type, la version, la hauteur et la largeur d'une image GIF mais je n'ai rien trouvé d'utile en ligne.
Heureusement dans le cas du GIF, toutes les informations requises se trouvaient dans les 10 premiers octets:
Les PNG sont légèrement plus complexes (la largeur et la hauteur sont de 4 octets chacune):
Comme mentionné ci-dessus, wotsit est un bon site pour des spécifications détaillées sur les formats d'image et de données, bien que les spécifications PNG de pnglib soient beaucoup plus détaillées. Cependant, je pense que l'entrée Wikipedia sur PNG et GIF formats est le meilleur point de départ.
Voici mon code original pour vérifier les GIF, j'ai également giflé quelque chose pour les PNG:
la source
Sur la base des réponses jusqu'à présent et de quelques recherches supplémentaires, il semble que dans la bibliothèque de classes .NET 2, il n'y ait aucune fonctionnalité pour cela. J'ai donc décidé d'écrire le mien. En voici une version très approximative. Pour le moment, je n'en avais besoin que pour les JPG. Donc, il complète la réponse publiée par Abbas.
Il n'y a pas de vérification d'erreur ni aucune autre vérification, mais j'en ai actuellement besoin pour une tâche limitée, et elle peut être éventuellement facilement ajoutée. Je l'ai testé sur un certain nombre d'images, et il ne lit généralement pas plus de 6K d'une image. Je suppose que cela dépend de la quantité de données EXIF.
la source
Je l'ai fait pour le fichier PNG
la source
Oui, vous pouvez absolument le faire et le code dépend du format de fichier. Je travaille pour un fournisseur d'imagerie ( Atalasoft ), et notre produit fournit un GetImageInfo () pour chaque codec qui fait le minimum pour connaître les dimensions et d'autres données faciles à obtenir.
Si vous voulez rouler le vôtre, je vous suggère de commencer par wotsit.org , qui contient des spécifications détaillées pour à peu près tous les formats d'image et vous verrez comment identifier le fichier et où les informations qu'il peuvent être trouvées.
Si vous êtes à l'aise avec C, alors le jpeglib gratuit peut également être utilisé pour obtenir ces informations. Je parierais que vous pouvez le faire avec les bibliothèques .NET, mais je ne sais pas comment.
la source
new AtalaImage(filepath).Width
fait quelque chose de similaire?Atalasoft.Imaging.Codec.RegisteredDecoders.GetImageInfo ( fullPath ) .Size
Mise à jour de la réponse d'ICR pour prendre en charge les jPeg et WebP progressifs également :)
la source
Cela dépendra du format de fichier. Habituellement, ils l'indiquent dans les premiers octets du fichier. Et, généralement, une bonne implémentation de lecture d'image en tiendra compte. Cependant, je ne peux pas vous en indiquer un pour .NET.
la source