1

J'essaie de coder une classe pour sculpter des images sculpter dans les directions x et y. La direction x fonctionne, et pour réduire la direction y j'ai pensé à simplement faire pivoter l'image de 90 ° et passer le même code sur l'image déjà redimensionnée (dans la direction x seulement) et ensuite la faire revenir à son état initial.RotatingImageImage change ses couleurs

J'ai trouvé quelque chose avec AffineTransform et je l'ai essayé. Il a effectivement produit une image pivotée, mais a gâché les couleurs et je ne sais pas pourquoi.

C'est tout le code:

import java.awt.image.BufferedImage; 
import java.awt.geom.AffineTransform; 
import java.awt.image.AffineTransformOp; 
import java.io.File; 
import java.io.IOException; 
import javafx.scene.paint.Color; 
import javax.imageio.ImageIO; 


public class example { 
/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) throws IOException { 
    // TODO code application logic here 

    BufferedImage imgIn = ImageIO.read(new File("landscape.jpg")); 
    BufferedImage imgIn2 = imgIn; 

    AffineTransform tx = new AffineTransform(); 
    tx.rotate(Math.PI/2, imgIn2.getWidth()/2, imgIn2.getHeight()/2);//(radian,arbit_X,arbit_Y) 

    AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR); 
    BufferedImage last = op.filter(imgIn2, null);//(sourse,destination) 
    ImageIO.write(last, "JPEG", new File("distortedColors.jpg")); 
} 

}

Juste Modifions le nom de fichier dans
BufferedImage imgIn = ImageIO.read(new File("landscape.jpg")); et l'essayer. Une fois exécuté, vous obtenez 4 images: une carte thermique, une image avec des coutures et une image redimensionnée. La dernière image est un test pour voir si la rotation a fonctionné et il devrait montrer une image tournée mais avec des couleurs déformées ...

Aide serait grandement appréciée!

EDIT:

enter image description here

+0

Avez-vous Debug pour vous assurer que vous n'êtes pas d'écrire les données erronées à cette image finale? Avez-vous veillé à utiliser les mêmes paramètres de couleur (espace colorimétrique, etc.)? Aussi s'il vous plaît poster un [mvce] (http://stackoverflow.com/help/mcve), c'est trop de code IMO. – Thomas

+0

Comment cela at-il gâché les couleurs? Est-ce que ça a été flou ou changé de couleurs comme tout le vert est devenu rose et ainsi? Peut-être pourriez-vous montrer vos images. –

+0

Bien sûr, laissez-moi le modifier très rapidement! – ViktorG

Répondre

2

Il semble qu'il y ait une conversion de couleur qui se passe en raison de passer à nullop.filter(imgIn2, null);.

Si vous changez comme ça il devrait fonctionner:

BufferedImage last = new BufferedImage(imgIn2.getWidth(), imgIn2.getHeight(), imgIn2.getType()); 
op.filter(imgIn2, last); 
+0

Works, va relire la documentation de AffineTransformOP pour trouver mon erreur. Je vous remercie – ViktorG

2

Le problème est avec le AffineTransformOp Vous avez besoin:

AffineTransformOp.TYPE_NEAREST_NEIGHBOR 

au lieu du BILINEAR que vous avez maintenant.

Deuxième paragraphe de la documentation allusion à ce sujet.

Cette classe utilise une transformation affine pour effectuer une application linéaire de coordonnées 2D dans l'image source ou Raster à des coordonnées 2D dans l'image de destination ou raster. Le type d'interpolation utilisé est spécifié par un constructeur, soit par un objet RenderingHints, soit par par l'un des types d'interpolation d'entier définis dans cette classe. Si un objet RenderingHints est spécifié dans le constructeur, l'indicateur d'interpolation et l'indicateur de qualité de rendu sont utilisés pour définir le type d'interpolation pour cette opération.

L'indicateur de rendu des couleurs et l'indice de tramage peuvent être utilisés lorsque la conversion des couleurs est requise. Notez que les contraintes suivantes doivent être respectées: La source et la destination doivent être différentes. Pour les objets Raster, le nombre de bandes dans la source doit être égal au nombre de bandes dans la destination.

ceci marche

AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);