Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1230 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  BufferedImage a passer en parametre

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

BufferedImage a passer en parametre

n°2062084
dumoulex
Posté le 09-03-2011 à 16:05:42  profilanswer
 


 
Bonjour,
 
voici mon soucis, je dois passer un bufferedImage en parametre d'une fonction pour pouvoir lui attribuer une valeur, mais cela ne marche pas...
 
j'ai une fonction du genre  

Code :
  1. int calcul(BufferedImage image)[
  2. // blabla
  3. try {
  4. image = ImageIO.read(in);
  5. } catch (IOException e) {
  6. e.printStackTrace();
  7. }
  8. return 1;
  9. }


et une autre qui fait :

Code :
  1. BufferedImage bi = null;
  2. int ret = calcul(bi);
  3. if(bi == null){
  4. System.out.println("image null" );
  5. }


cela m'affiche  
image nulle
mon image bi reste a la valeur null alors que je lui attribue une image dans la fonction calcul()...
 
j'ai deja resolu ce probleme pour des int et des String en utilisant IntHolder et StringHolder, qui permettent un passage d'argument par adresse et surtout qui ne sont pas immutable comme String et Integer
mais je ne vois pas pourquoi cela ne marche pas avec un BufferedImage puisque c'est un objet donc le passage se fait par adresse... la modification devrait être prise en compte...
Je sais que ma question peut paraitre bizzare, donc je precise que je ne PEUX PAS passer ma bufferedImage en retour de fonction, ca marche, pas de soucis mais je dois absolument retourner un entier donc pas de retour possible de cette facon.
Et je ne souhaite absolument pas creer un nouveau type d'objet genre MonImage qui contiendrait une bufferedImage ou qqch comme ca..
 
si quelqu'un a une solution, ou tout du moins une explication ca serait super !
 
merci

mood
Publicité
Posté le 09-03-2011 à 16:05:42  profilanswer
 

n°2062085
dumoulex
Posté le 09-03-2011 à 16:09:08  profilanswer
 

precision pour eviter que l'on me dise qu'est ce que c'est que cette maniere de faire ?
je n'ai pas trop le choix, on me demande de faire comme ca, mais je sais que c'est pas le top ! mais j'obeis !


Message édité par dumoulex le 09-03-2011 à 16:09:27
n°2062090
zapan666
Tout est relatif
Posté le 09-03-2011 à 16:43:00  profilanswer
 

dumoulex a écrit :


voici mon soucis, je dois passer un bufferedImage en parametre d'une fonction pour pouvoir lui attribuer une valeur, mais cela ne marche pas...


normal, tu peux pas.
 
Par contre, ta méthode peut retourner le BufferedImage.
 

Code :
  1. public BufferedImage calcul() throws IOException {
  2.     return ImageIO.read(in);
  3. }


 
et le code appelant :  
 

Code :
  1. try {
  2.     BufferedImage bi = calcul();
  3.    
  4.     if(bi == null){
  5.     System.out.println("image null" );
  6.     }
  7. } catch(IOException ex) {
  8.     System.out.println("Problème blablabla" );
  9.    
  10. }



---------------
my flick r - Just Tab it !
n°2062162
dumoulex
Posté le 10-03-2011 à 08:41:48  profilanswer
 

bon, je reformule !  
je ne peux pas récupérer la BufferedImage en retour car mon retour est obligatoirement un entier dont j'ai également besoin. Avant je récupérais mon image en retour mais je dois changer mon code pour avoir un retour d'entier et ça, c'est non négociable !
 
pourquoi tu dis que je ne peux pas ? c'est vague comme explication !
 
ce code la, qui fait exactement la meme chose mais avec un entier, marche très bien (il fonctionne aussi avec StringHolder pour recuperer une chaine de caracteres) :
 

Code :
  1. int calcul(IntHolder entier)[
  2. entier.value = 5;
  3. System.out.println("valeur de bi : " + bi.value" );
  4. int ret = 2;
  5. return ret;
  6. }


 
avec l'appel  

Code :
  1. IntHolder bi = new IntHolder(-1);
  2. System.out.println("valeur de bi : " + bi.value" );
  3. int ret = calcul(bi);
  4. if(bi.value != -1){
  5. System.out.println("valeur de bi : " + bi.value" );
  6. }


 
avec ce code ma variable bi prend les valeurs :
valeur de bi : -1
valeur de bi : 5
valeur de bi : 5
 
le changement se fait donc bien.  
ce n'est pas possible de faire un truc similaire avec BufferedImage ? ou une classe derivee ?
 
J'ai utilisé IntHolder car cela ne marche pas avec int (passage en argument par valeur) ni avec Integer (passage par reference mais type immutable donc creation d'une nouvelle zone memoire lors de la modification)
 
si ca marche pour IntHolder je suppose qu'il y a un moyen de le faire marcher avec tout type de classe
 

Message cité 1 fois
Message édité par dumoulex le 10-03-2011 à 08:44:50
n°2062163
dumoulex
Posté le 10-03-2011 à 08:44:13  profilanswer
 

je sais que ca devrait surement marcher en encapsulant la bufferedImage dans une nouvelle classe que je pourrais implementer mais j'aimerais eviter si possible..


Message édité par dumoulex le 10-03-2011 à 08:46:25
n°2062180
zapan666
Tout est relatif
Posté le 10-03-2011 à 10:07:03  profilanswer
 

dumoulex a écrit :


pourquoi tu dis que je ne peux pas ? c'est vague comme explication !


Parce que tu passe la copie de la valeur de la référence ( :whistle: ) et comme tu modifie une copie, à la sortie de la méthode, tu n'a pas modifié la référence d'origine. (pour ne pas te faire piéger, tu peux mettre final devant ton argument)

Code :
  1. public void maMethod(final BufferedImage img) {
  2.     // blabla
  3.     img = new BufferedImage(); // erreur du compilateur.
  4. }


C'est d'ailleurs pour ça que quand tu encapsule le tout ça marche : tu ne modifie pas la référence.

 

Pour en savoir plus :
http://blog.xebia.fr/2011/01/13/le [...] reference/


Message édité par zapan666 le 10-03-2011 à 10:07:36

---------------
my flick r - Just Tab it !
n°2062193
dumoulex
Posté le 10-03-2011 à 10:52:11  profilanswer
 

j'ai trouvé ma solution, etant donné que ca me fais **** de recreer un nouvel objet je me suis penché sur Holder
 
et j'utilise la classe javax.xml.rpc.holders.ObjectHolder
 
avec ca c'est nickel
 
ObjectHolder oh = new ObjectHolder(null);
 
j'envoie mon objet
et je lui assigne ma bufferedImage
oh.value = maBufferedImage
 
et comme ca je peux la recuperer.
 
je comprend maintenant pourquoi ca marchait pas avant, si je reassigne une valeur a mon objet alors nouvel espace memoire et donc pas moyen de recuperer mes nouvelles donnees..
 
en tout cas ca marche maintenant.
 
je pense que je vais garder ce package de coté !

n°2062194
dumoulex
Posté le 10-03-2011 à 10:53:03  profilanswer
 

donc c'est nickel, pas de nouvelle classe et je garde mon retour d'entier !

n°2062209
zapan666
Tout est relatif
Posté le 10-03-2011 à 11:21:17  profilanswer
 

dumoulex a écrit :


en tout cas ca marche maintenant.


ça marche mais c'est vraiment très moche : tu utilise un truc qui n'a aucun rapport avec la choucroute... Si un mec repasse derrière, il va se poser des questions sur le pourquoi du comment tu as utilisé ça pour faire ça...
 

dumoulex a écrit :

donc c'est nickel, pas de nouvelle classe et je garde mon retour d'entier !


ouais bah le retour d'entier, c'est pareil, je trouve ça assez, voir complètement moche : c'est pour savoir si la création de l'objet à réussi ou non ? Pourquoi ne pas utiliser le mécanisme d'exception qui est fait...pour ça ?  
 


---------------
my flick r - Just Tab it !
n°2062215
dumoulex
Posté le 10-03-2011 à 11:30:36  profilanswer
 

j'y peux rien, c'est mon boss qui me demande de faire le retour d'entier...
c'est un code de retour renvoyé depuis un serveur qui transite par ma fonction et etant donné qu'il y a environ 20 fonctions il faut qu'elles aient toutes le même type de retour a savoir int
 
donc du moment que je peux pas faire de return BufferedImage (contraintes obligatoire) j'ai pas le choix.
 
et au final, recreer une classe pour l'encapsuler ca revient exactement au meme qu'utiliser la classe ObjectHolder.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  BufferedImage a passer en parametre

 

Sujets relatifs
[SQL SERVER 2008] : Parametre OUTPUT qui sort paspasser un userform en variable
PaperVision3D : passer de la 2d a la 3d = problème de coordonnées :-/[java] Afficher une BufferedImage dans un Jframe ?
[MySQL / PL/SQL] Selection passée en paramètre[résolu] Paramètre POST dans une ligne de commande wget
récupérer paramètre template int[resolu]allocation dynamique double pointeur passer en parametre
Passer un argument à un batch sans passer par un fichier 
Plus de sujets relatifs à : BufferedImage a passer en parametre


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR