プログラマメモ2 - programmer no memo2

PerspectiveTransformを使ってみる - 台形変形に向けて 2008/05/18

Javaです。
どうも、アファイン変換を使って台形に変形できないようなので、いろいろさがしていたら、JAI( Java Advanced Imaging)にPerspectiveTransformというクラスがありそれを使うと台形に変形できました。




かくかくしていてあまりできがよくないですが...



package pers;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.NoninvertibleTransformException;
import java.awt.image.BufferedImage;
import java.awt.image.renderable.ParameterBlock;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.media.jai.JAI;
import javax.media.jai.PerspectiveTransform;
import javax.media.jai.PlanarImage;
import javax.media.jai.RenderedOp;
import javax.media.jai.WarpPerspective;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test4_PerspectiveTransform {

static class Panel extends JPanel {

@Override
protected void paintComponent(Graphics g) {

Graphics2D g2d = (Graphics2D) g;
p(g2d);

}

void p(Graphics2D g2d) {

try {
BufferedImage image = c();
g2d.drawImage(image, 30, 20, null);
g2d.drawImage(a(image), 30 + image.getWidth() + 10, 20, null);
} catch (IOException e) {
e.printStackTrace();
} catch (NoninvertibleTransformException e) {
e.printStackTrace();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}

}

/**
* イメージを読み込みます。
* @return
* @throws IOException
*/
static BufferedImage c() throws IOException {
BufferedImage src = ImageIO.read(Test4_PerspectiveTransform.class
.getResource("z.jpg"));
// ※背景を透明にするらめにわざわざ描き直しています。
// 他にいい方法はないのか?
BufferedImage image = new BufferedImage(src.getWidth(), src.getHeight(),
BufferedImage.TYPE_INT_ARGB_PRE);
Graphics2D g2d = (Graphics2D) image.getGraphics();
g2d.drawImage(src, 0, 0, null);

return image;
}

public static void main(String[] args) {

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new Panel());
frame.setSize(500, 250);
frame.setVisible(true);

}

/**
* 台形にします。
* @param image
* @return
* @throws NoninvertibleTransformException
* @throws CloneNotSupportedException
*/
public static BufferedImage a(BufferedImage image)
throws NoninvertibleTransformException, CloneNotSupportedException {

int w = image.getWidth();
int h = image.getHeight();
PerspectiveTransform transform = PerspectiveTransform.getQuadToQuad(0,
0, w, 0, w, h, 0, h, 0, 0, w, 30, w, h - 30, 0, h
);

ParameterBlock pb = new ParameterBlock();

pb.addSource(image);
pb.add(new WarpPerspective(transform.createInverse()));

RenderedOp renderedOp = JAI.create("warp", pb);

PlanarImage planarImage = renderedOp.createInstance();

return planarImage.getAsBufferedImage();
}
}

: