Re: How do you crop an image?
OK. Let's start from scratch then. You want to get a BufferedImage
from a file or the net and create a sub image that from the original.
To get a BufferedImage you have to use the imageio package to load and
save. You need to look at the ImageIO.read() and ImageIO.write()
methods. A BufferedImage is very easy to get a sub image from, you use
the BufferedImage.getSubImage() method. The only thing to watch out for
here is that the sub image uses the same pixel data as the original.
Please look at my CropComponent class below to see a simple example of
what you want to do. The sub image is saved to the file, crop.jpg, as
soon as you release the mouse button.
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
public class CropComponent extends JPanel {
BufferedImage bi,subImage;
boolean mouseDown;
int startX,startY;
int endX,endY;
int x,y,w,h;
public CropComponent(BufferedImage bi) {
this.bi = bi;
setPreferredSize(new Dimension(bi.getWidth(),bi.getHeight()));
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent me) {
mouseDown = true;
startX = me.getX();
startY = me.getY();
}
public void mouseReleased(MouseEvent me) {
mouseDown = false;
subImage =
CropComponent.this.bi.getSubimage(x,y,w+1,h+1);
Runnable r = new Runnable() {
public void run() {
try {
ImageIO.write(
subImage,"JPEG",new File("crop.jpg"));
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
};
new Thread(r).start();
x = y = w = h = 0;
repaint();
}
});
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent me) {
endX = Math.max(0,me.getX());
endX =
Math.min(endX,CropComponent.this.bi.getWidth()-1);
endY = Math.max(0,me.getY());
endY =
Math.min(endY,CropComponent.this.bi.getHeight()-1);
if (startX < endX && startY < endY) {
x = startX;
y = startY;
w = endX-startX;
h = endY-startY;
} else if (startX > endX && startY > endY) {
x = endX;
y = endY;
w = startX-endX;
h = startY-endY;
} else if (startX < endX && startY > endY) {
x = startX;
y = endY;
w = endX-startX;
h = startY-endY;
} else if (startX > endX && startY < endY) {
x = endX;
y = startY;
w = startX-endX;
h = endY-startY;
}
repaint();
}
});
}
public void paintComponent(Graphics g2D) {
Graphics2D g = (Graphics2D)g2D;
g.drawImage(bi,0,0,null);
if (mouseDown) {
g.setStroke(new BasicStroke(1.0f,BasicStroke.CAP_SQUARE,
BasicStroke.JOIN_ROUND,1.0f,new float[] {2.0f,3.0f},1.0f));
g.setColor(Color.WHITE);
g.drawRect(x,y,w,h);
}
}
public static void main(final String[] args) {
Runnable r = new Runnable() {
public void run() {
try {
BufferedImage bi = ImageIO.read(new File(args[0]));
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
CropComponent cc = new CropComponent(bi);
f.add(cc,BorderLayout.CENTER);
f.pack();
f.setVisible(true);
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
};
EventQueue.invokeLater(r);
}
}
--
Knute Johnson
email s/nospam/knute/