How to crop image in java?

落花浮王杯 提交于 2020-01-07 09:26:05

问题


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:

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

How to crop image as expect?


回答1:


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

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




回答2:


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.



来源:https://stackoverflow.com/questions/50562388/how-to-crop-image-in-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!