PerspectiveTransformを使ってみる - 台形変形に向けて
2008/05/18
JAI
java
画像処理
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();
}
}
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();
}
}
: