开发者

Selecting a region of an Image

I need a method to select a rectangular region from an image (a BufferedImage into a JLabel).开发者_JAVA百科

When the user selects a region, I need to save the four points of the rectangle (pixel positions).

How to implement this using Java?

Is there a ready-to-use component?


To select a region of a BufferedImage, just do:

BufferedImage newImage = yourImage.getSubimage(x, y, width, height);

Adapt the code and provide the parameters x, y, width and height to define the rectangle.

Important: The new image will be linked to the original! If you update one, the other follows.

See the Javadoc for more info.


EDIT: About the component that will allow the user to select the region, you can do a simple one yourself; or search a pre-made one in libraries like SwingX, ...

If you choose to make a custom component, an approach will be: display the original image and ask the user to click on the first and second points of the rectangle to extract.

You can use a MouseListener to save the position of the user's clicks and pass these parameters to getSubimage. This would be an example:

public class RegionSelectorListener extends MouseAdapter {
    final JLabel label;

    public RegionSelectorListener(JLabel theLabel) {
        this.label = theLabel;
        theLabel.addMouseListener(this);
    }

    Point origin = null;

    public void mouseClicked(MouseEvent event) {
        if (origin == null) { //If the first corner is not set...

            origin = event.getPoint(); //set it.

        } else { //if the first corner is already set...

            //calculate width/height substracting from origin
            int width = event.getX() - origin.x;
            int height = event.getY() - origin.y;

            //output the results (replace this)
            System.out.println("Selected X is: "+ origin.x);
            System.out.println("Selected Y is: "+ origin.y);
            System.out.println("Selected width is: "+ width);
            System.out.println("Selected height is: "+ height);
        }
    }
}

To use it:

new RegionSelectorListener(yourlabel);
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜