Translation d'une image avec l'API JAI

lyra88 Messages postés 3 Date d'inscription samedi 16 mai 2009 Statut Membre Dernière intervention 16 mai 2009 - 16 mai 2009 à 20:03
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 16 mai 2009 à 22:00
Bonjour,

Je réalise un projet de recalage d'images sous java et je dois donc translater une image, pour cela j'utilise l'API JAI.
J'ai donc écrit une petite classe avec des ParameterBlock, des JAI.create et tout, comme indiqué dans la JAI doc, j'ai retrouvé ce code sur tout plein de sites, seulement il ne marche pas ! Enfin l'image n'est pas translatée.
J'ai essayé avec TranslateDescriptor, AffineDescriptor, ScaleDescriptor, mais toujours le même résultat, c'est à dire la même image qu'en entrée. Quand je lance la classe, tout se passe normalement, je n'ai aucun message d'erreur.

Je ne vois pas du tout d'où vient le problème, peut etre du RenderingHints mais j'ai pas très bien compris à quoi ca sert.

Voici mon code. J'espère que quelqu'un trouvera mon erreur, ca fait plusieurs jours que je me prends la tête dessus.

import javax.media.jai.JAI;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.renderable.ParameterBlock;
import javax.media.jai.operator.TranslateDescriptor;
import javax.media.jai.PlanarImage;
import javax.media.jai.Interpolation;


public class Translation
{
public static void main(String args[])
{
String s="image.tif";

PlanarImage image = JAI.create("fileload",s);

float translateX = 10f;
float translateY = 20f;

Interpolation interpolation = Interpolation.getInstance( Interpolation.INTERP_BILINEAR );
RenderingHints hints = new RenderingHints(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

ParameterBlock pb1 = new ParameterBlock();
pb1.addSource(image);
pb1.add(translateX);
pb1.add(translateY);
pb1.add(interpolation);
pb1.add(hints);
PlanarImage imtranslate = (PlanarImage)JAI.create("translate",pb1);

ParameterBlock pb2 = new ParameterBlock();
pb2.addSource(imtranslate);
pb2.add("imagetranslate.tif");
JAI.create("filestore",pb2,null);

}
}


Merci par avance.

5 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
16 mai 2009 à 20:59
Salut,

Je ne vois pas trop l'intérêt d'utiliser JAI pour faire une simple translation d'image, mais bon, pourquoi pas.

Tu dis que ca ne marche pas et que l'image n'est pas translatée, mais dans ton code, je ne vois aucun endroit où tu affiche l'image de résultat (ou d'écriture dans un fichier). C'est peut-être cà le problème : si tu ne fais rien de l'image créer par JAI, c'est normal qu'il ne se passe rien...
0
lyra88 Messages postés 3 Date d'inscription samedi 16 mai 2009 Statut Membre Dernière intervention 16 mai 2009
16 mai 2009 à 21:08
Salut,

Merci de ta réponse.
J'utilise la JAI parce que pour détecter le décalage de mon image je fais des calculs de transformée de Fourier, donc j'ai mon image sous forme de PlanarImage. Et mes décalages ne sont pas toujours des nombres entiers. Mais si y a une méthode plus simple je veux bien un petit conseil ^^

J'enregistre mon image a la fin à l'aide de 'filestore', mais peut etre que je m'y prends mal la.
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
16 mai 2009 à 21:20
Salut,

Si ma mémoire est bonne (ca fait un bout de temps que je n'ai pas utilisé JAI !), la fonction create ne permet que de créer un renderer, et non l'enregistrement !

Je peux te conseiller d'aller voir ma source DKSWordArt : j'y utilise nottament JAI pour enregistrer au format gif et PNG.
0
lyra88 Messages postés 3 Date d'inscription samedi 16 mai 2009 Statut Membre Dernière intervention 16 mai 2009
16 mai 2009 à 21:37
Pourtant quand j'enregistre la transformée de Fourier de mon image avec create ca m'enregistre la bonne image, de même après un scale.

Dans quelle classe de ta source je dois regarder pour l'enregistrement d'image ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
16 mai 2009 à 22:00
Voici grosso-modo le code d'enregistrement (je trace dans un BufferedImage l'image que je génère grâce à JAI, et je l'enregistre dans mon fichier) :

try {
IIOParamController controller = param.getController();
if (controller != null) {
controller.activate(param);
}

ImageOutputStream fios = ImageIO.createImageOutputStream(file);
writer.setOutput(fios);
int type = BufferedImage.TYPE_3BYTE_BGR;
if (format.equals("png"))
{
type = BufferedImage.TYPE_4BYTE_ABGR;
}
BufferedImage image = new BufferedImage(_wordArt.getTotalSize().width, _wordArt.getTotalSize().height, type);
Graphics g = image.createGraphics();
_wordArt.draw(g, 0, 0, true);
g.dispose();
writer.write(image);
writer.dispose();
fios.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}


Code extrait de la classe dksWordArt/dks/src/test/FrmMain.java
0
Rejoignez-nous