Аффинное преобразование изображения
Листинг 15.5. Аффинное преобразование изображения.
import java.awt.*; import Java.awt.geom.*; import Java.awt .image.*; import java.awt.event.*; public class AffOp extends Frame{ private Bufferedimage bi; public AffOp(String s){ super (s); // Загружаем изображение img Image img = getToolkit().getlmage("javalogo52x88.gif"); // В этом блоке организовано ожидание загрузки try{ MediaTracker mt = new MediaTracker(this); mt.addlmage(img, 0); mt.waitForlD(O); // Ждем окончания загрузки } catch(Exception e){} // Размеры создаваемой области bi совпадают //с размерами изображения img bi = new Bufferedlmage(img.getWidth(this), img.getHeight(this), Bufferedlmage.TYPE_INT_RGB); // Создаем графический контекст big изображения bi Graphics2D big = bi.createGraphics(); // Выводим изображение img в графический контекст big big.drawImage(img, 0, 0, this); } public void paint(Graphics g){ Graphics2D g2 = (Graphics2D)g; int w = getSize().width; int h = getSize().height; int bw = bi.getWidth(this); int bh = bi.getHeight(this); // Создаем аффинное преобразование at AffineTransform at = new AffineTransform(); at.rotate(Math.PI/4); // Задаем поворот на 45 градусов //по часовой стрелке вокруг левого верхнего угла. //Затем сдвигаем изображение вправо на величину bw at.preConcatenate(new AffineTransform(l, 0, О, 1, bw, 0)); // Определяем область хранения bimg преобразованного // изображения. Ее размер вдвое больше исходного Bufferedimage bimg = new Bufferedlmage(2*bw, 2*bw, Bufferedlmage.TYPE_INT_RGB); // Создаем объект biop,. содержащий преобразование at BufferedlmageOp biop = new AffineTransformOp(at, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); // Преобразуем изображение, результат заносим в bimg biop.filter(bi, bimg); // Выводим исходное изображение .g2.drawlmage(bi, null, 10, 30); // Выводим измененную преобразованием Ыор область bi g2.drawImage(bi, biop, w/4+3, 30); // Выводим преобразованное внутри области bimg изображение g2.drawlmage(bimg, null, w/2+3, 30); } public static void main(String[] args){ Frame f = new AffOpf" Аффинное преобразование"); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); f.setSize(400, 200); f.setVisible(true); } }
На рис. 15.6 показано исходное изображение, преобразованная область и преобразованное внутри области изображение.
Рис.15.6. Аффинное преобразование изображения