luongkhanh
luongkhanh

Reputation: 1823

How to crop image in java?

I'm using java to crop image when upload file, I set value and to try to crop but is not get correct size of image as I expected

This my code: (updated)

private BufferedImage cropImageSquare(byte[] image) throws IOException {        
    InputStream in = new ByteArrayInputStream(image);
    BufferedImage originalImage = ImageIO.read(in);

    System.out.println("Original Image Dimension: "+originalImage.getWidth()+"x"+originalImage.getHeight());            

    BufferedImage croppedImage = originalImage.getSubimage(300, 150, 500, 500);
    System.out.println("Cropped Image Dimension: "+croppedImage.getWidth()+"x"+croppedImage.getHeight());


     return croppedImage;
}

my photo:

enter image description here

I want to crop image as above image (red line) but my code is seem incorrect.

How to crop image as expect?

Upvotes: 0

Views: 6567

Answers (2)

MadProgrammer
MadProgrammer

Reputation: 347324

I want to crop image as above image (red line) but my code is seem incorrect.

So, your input image is 1024x811 and your "target" image is 928x690, which is roughly 0.906x0.8509 reduction/difference - so the real question is ... which one of those is the right value?

Through my testing, based on this image, 0.8509 produces the best result

FromTo

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Test {

    public static void main(String[] args) throws IOException {
        BufferedImage crop = new Test().crop(0.8509);
        System.out.println(crop.getWidth() + "x" + crop.getHeight());
        ImageIO.write(crop, "jpg", new File("Square.jpg"));
    }

    public BufferedImage crop(double amount) throws IOException {
        BufferedImage originalImage = ImageIO.read(Test.class.getResource("Cat.jpg"));
        int height = originalImage.getHeight();
        int width = originalImage.getWidth();

        int targetWidth = (int)(width * amount);
        int targetHeight = (int)(height * amount);
        // Coordinates of the image's middle
        int xc = (width - targetWidth) / 2;
        int yc = (height - targetHeight) / 2;

        // Crop
        BufferedImage croppedImage = originalImage.getSubimage(
                        xc, 
                        yc,
                        targetWidth, // widht
                        targetHeight // height
        );
        return croppedImage;
    }

}

Now, this doesn't do any checks (xc + targetWidth > imageWidth), but I'm sure you can fill that out

Upvotes: 1

Abhishek
Abhishek

Reputation: 698

Code is working fine for me.

public class Test {

    public static void main( String[] args ) throws IllegalAccessException, InstantiationException {

        try{
              BufferedImage image = ImageIO.read(new File("C:\\Users\\guptab\\Pictures\\American.png"));
              ByteArrayOutputStream baos = new ByteArrayOutputStream();
              ImageIO.write(image, "png", baos);
             byte[] res=baos.toByteArray();
             image = new Test().cropImageSquare(res);

        } 
        catch(Exception e) {
             e.printStackTrace();
        System.out.println("Error");
        }
        }



    private BufferedImage cropImageSquare(byte[] image) throws IOException {        
        InputStream in = new ByteArrayInputStream(image);
        BufferedImage originalImage = ImageIO.read(in);

        System.out.println("Original Image Dimension: "+originalImage.getWidth()+"x"+originalImage.getHeight());            

        BufferedImage croppedImage = originalImage.getSubimage(300, 150, 300, 600);
        System.out.println("Cropped Image Dimension: "+croppedImage.getWidth()+"x"+croppedImage.getHeight());


         return croppedImage;
    }
}

Output is:

Original Image Dimension: 1279x1023
Cropped Image Dimension: 300x600

Definition of getSubImage method:

BufferedImage java.awt.image.BufferedImage.getSubimage(int x, int y, int w, int h)


Returns a subimage defined by a specified rectangular region. The returned BufferedImage shares the same data array as the original image.
Parameters:x the X coordinate of the upper-left corner of the specified rectangular regiony the Y coordinate of the upper-left corner of the specified rectangular regionw the width of the specified rectangular regionh the height of the specified rectangular regionReturns:a BufferedImage that is the subimage of this BufferedImage.

So int x and int y (First two Parameters are coordinates of image, not dimensions), only int w, int h (last two parameters) are dimensions of the image which is working fine.

Upvotes: 1

Related Questions