Existe-t-il un autre moyen que d'utiliser ImageIO.read pour obtenir la hauteur et la largeur de l'image?
Parce que je rencontre un problème qui bloque le fil.
at com.sun.medialib.codec.jpeg.Decoder.njpeg_decode(Native Method)
at com.sun.medialib.codec.jpeg.Decoder.decode(Decoder.java:87)
at com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader.decode(CLibJPEGImageReader.java:73)
- locked <0xd96fb668> (a com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader)
at com.sun.media.imageioimpl.plugins.clib.CLibImageReader.getImage(CLibImageReader.java:320)
- locked <0xd96fb668> (a com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader)
at com.sun.media.imageioimpl.plugins.clib.CLibImageReader.read(CLibImageReader.java:384)
- locked <0xd96fb668> (a com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader)
at javax.imageio.ImageIO.read(ImageIO.java:1400)
at javax.imageio.ImageIO.read(ImageIO.java:1322)
Cette erreur ne se produit que sur un serveur d'applications Sun et je soupçonne donc qu'il s'agit d'un bogue Sun.
java
javax.imageio
argent est
la source
la source
jstack
).Réponses:
Voici quelque chose de très simple et pratique.
la source
Ceci est une réécriture du grand article de @Kay, qui lance IOException et fournit une sortie anticipée:
Je suppose que mon représentant n'est pas assez élevé pour que ma contribution soit considérée comme une réponse.
la source
javax.imageio.ImageIO.getImageReadersByMIMEType(mimeType)
si vous vouliez être certain du type de fichier?.close()
en streaming avant de revenir? sinon vous laissez le flux ouvertorg.apache.commons.io.FilenameUtils#getExtension
pour détecter l'extension de nom de fichier.J'ai trouvé un autre moyen de lire une taille d'image (plus générique). Vous pouvez utiliser la classe ImageIO en coopération avec ImageReaders. Voici l exemple de code:
Notez que getFileSuffix est une méthode qui renvoie l'extension du chemin sans "." donc par exemple: png, jpg etc. Exemple d'implémentation:
Cette solution est très rapide car seule la taille de l'image est lue à partir du fichier et non de l'image entière. Je l'ai testé et il n'y a aucune comparaison avec les performances d'ImageIO.read. J'espère que quelqu'un trouvera cela utile.
la source
getFileSuffix()
contient des ifs inutiles et l'initialisation avecnull
n'est pas une bonne idée dans ce cas.ImageIO.read()
complètement hors de l'eau, à la fois en termes de temps CPU et d'utilisation de la mémoire.J'ai essayé de tester les performances en utilisant certaines des différentes approches répertoriées. Il est difficile de faire un test rigoureux car de nombreux facteurs affectent le résultat. J'ai préparé deux dossiers, un avec 330 fichiers jpg et un autre avec 330 fichiers png. La taille moyenne des fichiers était de 4 Mo dans les deux cas. Ensuite, j'ai appelé getDimension pour chaque fichier. Chaque implémentation de la méthode getDimension et chaque type d'image ont été testés séparément (exécution distincte). Voici les temps d'exécution que j'ai obtenus (premier nombre pour jpg, deuxième nombre pour png):
Il est évident que certaines méthodes chargent le fichier entier afin d'obtenir des dimensions tandis que d'autres se contentent de lire certaines informations d'en-tête de l'image. Je pense que ces chiffres peuvent être utiles lorsque les performances des applications sont critiques.
Merci à tous pour la contribution à ce fil - très utile.
la source
Vous pouvez charger des données binaires jpeg sous forme de fichier et analyser vous-même les en-têtes jpeg. Celui que vous recherchez est l'en-tête 0xFFC0 ou Start of Frame:
Pour plus d'informations sur les en-têtes, consultez l'entrée jpeg de wikipedia ou j'ai obtenu les informations ci-dessus ici .
J'ai utilisé une méthode similaire au code ci-dessous que j'ai obtenu de ce post sur les forums sun:
}
la source
==192
cela, il faudrait vérifier les numéros 192-207, sauf 196, 200 et 204.com.drewnoakes.metadata-extractor
bibliothèque pour extraire facilement ces enManière simple:
la source
Le problème avec ImageIO.read est qu'il est vraiment lent. Tout ce que vous avez à faire est de lire l'en-tête de l'image pour obtenir la taille.
ImageIO.getImageReader
est un candidat parfait.Voici l'exemple Groovy, mais la même chose s'applique à Java
Les performances étaient identiques à celles de l'utilisation de la bibliothèque java SimpleImageInfo.
https://github.com/cbeust/personal/blob/master/src/main/java/com/beust/SimpleImageInfo.java
la source
getReaderByFormat
?Vous pouvez utiliser la boîte à outils, pas besoin d'ImageIO
Si vous ne souhaitez pas gérer le chargement de l'image, faites
la source
Vous pouvez obtenir la largeur et la hauteur de l'image avec l'objet BufferedImage en utilisant java.
la source
Obtenir une image tamponnée avec ImageIO.read est une méthode très lourde, car elle crée une copie complète non compressée de l'image en mémoire. Pour les png, vous pouvez également utiliser pngj et le code:
la source
Ayant
ImageIO
beaucoup lutté ces dernières années, je pense que la solution d' Andrew Taylor est de loin le meilleur compromis (rapide: non utilisable et polyvalente). Merci mec!!ImageIO#read
Mais j'étais un peu frustré d'être obligé d'utiliser un fichier local (File / String), en particulier dans les cas où vous voulez vérifier les tailles d'image provenant, par exemple, d'une requête multipart / form-data où vous récupérez habituellement les
InputPart
/InputStream
. J'ai donc rapidement fait une variante qui accepteFile
,InputStream
etRandomAccessFile
, basée sur la capacité deImageIO#createImageInputStream
le faire.Bien sûr, une telle méthode avec
Object input
, ne peut rester que privée et vous devrez créer autant de méthodes polymorphes que nécessaire, en appelant celle-ci. Vous pouvez également accepterPath
avecPath#toFile()
etURL
avecURL#openStream()
avant de passer à cette méthode:la source
Donc, malheureusement, après avoir essayé toutes les réponses ci-dessus, je ne les ai pas mises au travail après des tentatives inlassables. J'ai donc décidé de faire le vrai hack moi-même et je vais travailler pour moi. J'espère que cela fonctionnerait parfaitement pour vous aussi.
J'utilise cette méthode simple pour obtenir la largeur d'une image générée par l'application et que je dois télécharger plus tard pour vérification:
Pls. prenez note: vous devrez activer les autorisations dans le manifeste pour accéder au stockage.
/ Je l'ai rendu statique et mis dans ma classe Global afin que je puisse le référencer ou y accéder à partir d'une seule source et s'il y a une modification, tout devrait être fait à un seul endroit. Simplement maintenir un concept DRY en java. (de toute façon) :) /
}
la source
Pour obtenir la taille du fichier emf sans lecteur d'images EMF, vous pouvez utiliser le code:
la source