1

Я пытаюсь закодировать класс для шва, вырезающего изображения в направлениях x и y. Направление x работает, и для уменьшения направления y я думал просто поворачивать изображение на 90 ° и запускать тот же код по уже измененному изображению (только в направлении x), а затем повернуть его обратно в исходное состояние.Вращение BufferedImage меняет свои цвета

Я нашел что-то с AffineTransform и попробовал. На самом деле он произвел повернутое изображение, но перепутал цвета, и я не знаю, почему.

Это весь код:

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")); 
} 

}

Просто изменить имя файла в
BufferedImage imgIn = ImageIO.read(new File("landscape.jpg")); и попробовать его.

При выполнении вы получаете 4 изображения: теплоизображение, изображение с швами в нем и изображение с масштабированием. Последнее изображение - это тест, чтобы увидеть, работает ли поворот, и он должен показывать повернутое изображение, но с искаженными цветами ...

Помощь была бы принята с благодарностью!

EDIT:

enter image description here

+0

ли вы отладку, чтобы убедиться, что вы не пишете неправильные данные об этом конечном изображении? Удостоверились ли вы использовать одни и те же настройки цвета (цветовое пространство и т. Д.)? Также, пожалуйста, напишите [mvce] (http://stackoverflow.com/help/mcve), это слишком много кода IMO. – Thomas

+0

Как это испортило цвета? Было ли это размытым или измененным цветом, как все зеленые розовые и так? Возможно, вы можете показывать свои изображения. –

+0

Конечно, позвольте мне изменить его очень быстро! – ViktorG

ответ

2

Похоже, что это преобразование цвета происходит из-за прохождения null к op.filter(imgIn2, null);.

Если вы измените его, как, что он должен работать:

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

Работы, перечитайте документацию AffineTransformOP, чтобы найти мою ошибку. спасибо – ViktorG

2

Проблема заключается с AffineTransformOp Понадобится:

AffineTransformOp.TYPE_NEAREST_NEIGHBOR 

вместо билинейной у вас есть сейчас.

Второй абзац из документации указывает на это.

Этот класс использует аффинное преобразование, чтобы выполнить линейное отображение из 2D-координаты в исходном изображении или Растровые изображения в 2D-координаты в изображении назначения или растр. Используемый тип интерполяции - это , заданный конструктором либо объектом RenderingHints, либо одним из целочисленных типов интерполяции, определенных в этом классе. Если в конструкторе задан объектRenderHints, то интерполяционный подсказку и подсказку качества рендеринга используются для установки типа интерполяции для этой операции.

Подсказка по цветопередаче и подсказка сглаживания может использоваться, когда требуется преобразование цвета. Примечание , что необходимо выполнить следующие ограничения: Источник и назначение должны быть разными. Для объектов Raster количество полос в источнике должно быть равно количеству полос в месте назначения.

Так это работает

AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); 
Смежные вопросы