Lire la hauteur et la largeur d'une image. - Java - Programmation
Marsh Posté le 05-04-2004 à 16:09:00
Code :
|
Marsh Posté le 05-04-2004 à 16:21:19
Yo, merci !
Je savais bien qu'il suffisait de demander
Sauf que c'est getIconWidth() et getIconHeight(), mais bon on va pas chipoter.
Marsh Posté le 05-04-2004 à 16:36:51
Mara's dad a écrit : Yo, merci ! |
toi tu vas avoir des surprises ...
Marsh Posté le 05-04-2004 à 16:39:17
nraynaud a écrit : toi tu vas avoir des surprises ... |
Marsh Posté le 05-04-2004 à 16:49:30
lorill a écrit : genre ca marchera pas sans interface graphique ? |
Heu, là ça marche très bien sur mon serveur tomcat 4.1...
Marsh Posté le 05-04-2004 à 17:03:55
Mara's dad a écrit : |
je sais pas si c'est le cas pour ImageIcon, mais sous unix, quand X n'est pas installé, certaines classes d'awt renvoient en erreur.
Marsh Posté le 05-04-2004 à 17:11:32
lorill a écrit : genre ca marchera pas sans interface graphique ? |
je pense plutôt qu'il risque d'avoir la taille de l'icone d'attente de chargement s'il le fait trop tôt ...
Marsh Posté le 05-04-2004 à 17:20:16
ah, parce que le constructeur d'ImageIcon rend la main avant le chargement ?? comment ils peuvent renvoyer une exception si l'image est foireuse alors ?
Marsh Posté le 05-04-2004 à 17:29:52
lorill a écrit : |
-Djava.awt.headless=true -Dsun.java2d.fontpath=/usr/java1.4.1/jre/lib/fonts
(bon d'un autre coté le headless c'est à partir d'1.4 ...)
Marsh Posté le 05-04-2004 à 18:10:49
Bon, les Experts, z'êtes bien gentil, mais moi je fais comment alors
Marsh Posté le 06-04-2004 à 00:12:02
lorill a écrit : |
je confirme ... et c'est bien chiant ...
en jdk1.4 y a plus ce problème quand on se sert de java.imageio
Marsh Posté le 06-04-2004 à 00:13:57
Mara's dad a écrit : Bon, les Experts, z'êtes bien gentil, mais moi je fais comment alors |
perso pour ce genre de besoin moi j'ai utilisé JAI ... ca fait un peu massue pour écraser un parasite unicellulaire, mais bon ...
et puis le problème awt et serveur X se pose toujours
Marsh Posté le 06-04-2004 à 00:28:42
y'a des ptites libs sympa qui sont compatible 1.3
j'utilisais ... euh merde oublié le nom.... qui etait orientée analyse d'image mais avec un codec gif integré ..
Marsh Posté le 06-04-2004 à 00:51:27
the real moins moins a écrit : y'a des ptites libs sympa qui sont compatible 1.3 |
JAI c'est gros, JAI c'est mieux
Marsh Posté le 06-04-2004 à 22:15:30
Bon, y'en a marre de ce JAVA et ses 10 000 000 de classes moins bien documentées les unes que les autres
Comme je sais si bien le faire, je reprends le problème à la base.
Je vais me faire ma propre classe !
C'est pas la mer à boire, y'a que 3 types de fichiers à prendre en compte : PNG, GIF et JPEG.
J'ai commencé à regarder, et c'est super simple. Tous les formats de fichiers ont un header qui fourni des infos comme :
1- Une signature qui permet de vérifier le type de fichier.
2- La largeur de l'image en pixels.
3- La hauteur de l'image en pixels.
Et là je retombe dans les méandres de JAVA
J'ai donc un byte[] qui contient un fichier binaire.
Comment je fais pour transformer, par exemple pour le PNG, les 4 octets d'offset 16, 17, 18 et 19 en un nombre manipulable
J'ai essayé 'stupidement' de construire une chaîne hexa et ensuite de convertir cette chaîne en int, mais c'est tombé à l'eau parce-que les bytes sont signé ou un truc du genre...
Bref, c'est un truc que je saurais faire dans tous les languages que je connais SAUF java...
C'est quoi le truc, PLEASE ? ? ?
Marsh Posté le 06-04-2004 à 23:00:17
tab[19] + tab[18] * 256 + tab[17] * 256 * 256 + tab[17] * 256 * 256 * 256
Marsh Posté le 06-04-2004 à 23:06:47
J'y ai pensé, mais le problème, c'est que les bytes ne vont pas de 0 à 255. Ils sont signés...
Faut donc défaire la complétion à 9 et ensuite fire comme tu dis.
Je me dis qu'il doit quand même y avoir plus simple...
Marsh Posté le 07-04-2004 à 14:14:28
Ok !
Vala une tite classe qui vérifie le format des GIF, JPEG et PNG et qui retourne la largeur et la hauteur en Pixels !
Code :
|
Faut tout faire soit même ...
Marsh Posté le 07-04-2004 à 14:16:13
(je virerais juste les setters de ImageInformation)
Marsh Posté le 07-04-2004 à 14:45:10
drapal !
ca pourait me servir
juste pour être sûr. La méthode que tu as utilisée est valide pour tos les formats de GIF et jpeg ?
Marsh Posté le 07-04-2004 à 15:18:26
-- : Yes, je vais nettoyer le code
benou : J'ai pas testé tous les formats GIFS, mais c'est basé sur la spec du dernier format GIF89a qui est identique que le GIF87a pour largeur et hauteur. Pour le JPEG, je l'ai testé sur une image issue de PaintShopPro ( un JFIF donc ) et sur une image venant d'un appareil photo qui contient plein de headers en plus comment des commentaires et même une miniature.
De plus, le code de base pour GIF et JPEG n'est pas de moi je l'ai trouvé là : http://www.mail-archive.com/cocoon [...] 26086.html
Si t'as 1 heure, je reviens avec un code épuré des setters et plus homogène dans sa manière de traiter les bytes de manière à rendre le code plus compréhensible...
Marsh Posté le 07-04-2004 à 15:43:23
Mara's dad a écrit : |
génial !
Je sais qu'il y a un format de jpeg spécific au noir&blanc (je le sais pacre que ce type de jpeg passe pas sur les tel i-mode ). Faudrait voir si les headers sont identiques ...
Marsh Posté le 07-04-2004 à 16:07:59
Bon cette fois c'est la bonne
Code :
|
Specs pour GIFnnx : http://www.dcs.ed.ac.uk/home/mxr/gfx/2d/GIF89a.txt
Specs pour PNG : http://www.w3.org/TR/REC-png.html#C.IHDR
Specs pour JPEG : http://www.funducode.com/freec/Fil [...] rmat3b.htm
Pour tes Jpegs noir&blanc je pense pas que le problème soit le format du fichier, mais plutôt sur les algo de compression/décompression des données de l'image dont je n'ai rien à faire
Si vous trouvez des bugs, n'hésitez pas à me prévenir, merci.
EDIT : Modif du code pour remplacer le multiplications par 256 par des 'décallages' de les additions par des 'OR'.
Je ne sais pas si c'est plus optimisé en Java, mais en tout cas, c'est plus propre
Marsh Posté le 07-04-2004 à 16:17:33
ReplyMarsh Posté le 07-04-2004 à 17:06:50
Yes
C'est clair qu'on voit tout de suite le language pas du tout adapté à ce genre d'accrobaties...
J'aurai dû transformer mon tableau de bytes en un Document XML et traiter le problème en XSL-T
Marsh Posté le 07-04-2004 à 17:07:32
ReplyMarsh Posté le 07-04-2004 à 17:10:14
Mara's dad a écrit : C'est clair qu'on voit tout de suite le language pas du tout adapté à ce genre d'accrobaties... |
bha, c'est la même syntaxe que le C ... le seul truc c'est les bye signés (quelle connerie ! )
Marsh Posté le 07-04-2004 à 17:27:48
ReplyMarsh Posté le 07-04-2004 à 17:29:47
ReplyMarsh Posté le 07-04-2004 à 19:29:23
Maj du code, voir EDIT...
Marsh Posté le 15-04-2004 à 13:52:42
Les méthodes pour obtenir largeur et heuteur d'une image renvoient -1 tant que l'image n'est pas chargée.
Il faut utiliser un MediaTracker pour charger l'image.
On peut se mettre en attente jusqu'à ce que l'image soit chargée et après miracle ...
Marsh Posté le 05-04-2004 à 16:04:05
Bonjour,
J'utilise Java 1.3.1 (Impossible d'utiliser autre chose, pas la peine d'insister ! ! !)
Je cherche donc a récupérer la taille en pixel d'une image.
Le seul moyen que j'ai trouvé, c'est ça :
Image aRealImg = Toolkit.getDefaultToolkit().createImage( b );
Container cnt = new Container();
int w;
while( ( w = aRealImg.getWidth( cnt ) ) < 0 );
int h = aRealImg.getHeight( cnt ) ) < 0 );
Sachant que b est un byte[] dont je suis presque quazi certain (mais c'est pas la question) que c'est une image GIF, JPEG ou PNG.
La boucle sur getWidth(), c'est parce-qu'au premier appel, ça me retourne -1. Genre le truc il lui faut un moment avant de démarrer...
Bref, c'est tout ce que j'ai pu trouver pour l'instant.
Bien sûr je trouve ça cradissime, alors si une bonne âme avait un bon tuyau d'arrosage histoire de nettoyer un peu ce code, se serait surper gentil :D
Au fait, vous aurrez compris, le 'Container', j'en ai rien à faire. C'est juste pour getWidth() et getHeight() qui veulent un 'ImageObserver'. Je fais une appli WEB, j'ai pas d'interface graphique :D
---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.