Crop / crop jpg file with empty space using Java

Is there an environment that can remove the empty space (rectangular) of an image. We create thumbnails of images from technical drawings, which, unfortunately, are in PDF format. We convert PDF to SVG and then to JPG. Often the technical drawings are very small and are now placed in the upper left corner of the thumbnail:

+---------+----------------------+ | | | | (image) | | | | | +---------+ | | | | | | | | | | (empty space) | | | | | +--------------------------------+ 

So, how can I easily remove the empty space and compress the jpg file?

+7
java image crop
source share
2 answers

This can be done in JAI, as shown in this thread . Or here is some Java code that I just wrote that you can use to do this:

 public class TrimWhite { private BufferedImage img; public TrimWhite(File input) { try { img = ImageIO.read(input); } catch (IOException e) { throw new RuntimeException( "Problem reading image", e ); } } public void trim() { int width = getTrimmedWidth(); int height = getTrimmedHeight(); BufferedImage newImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = newImg.createGraphics(); g.drawImage( img, 0, 0, null ); img = newImg; } public void write(File f) { try { ImageIO.write(img, "bmp", f); } catch (IOException e) { throw new RuntimeException( "Problem writing image", e ); } } private int getTrimmedWidth() { int height = this.img.getHeight(); int width = this.img.getWidth(); int trimmedWidth = 0; for(int i = 0; i < height; i++) { for(int j = width - 1; j >= 0; j--) { if(img.getRGB(j, i) != Color.WHITE.getRGB() && j > trimmedWidth) { trimmedWidth = j; break; } } } return trimmedWidth; } private int getTrimmedHeight() { int width = this.img.getWidth(); int height = this.img.getHeight(); int trimmedHeight = 0; for(int i = 0; i < width; i++) { for(int j = height - 1; j >= 0; j--) { if(img.getRGB(i, j) != Color.WHITE.getRGB() && j > trimmedHeight) { trimmedHeight = j; break; } } } return trimmedHeight; } public static void main(String[] args) { TrimWhite trim = new TrimWhite(new File("...\\someInput.bmp")); trim.trim(); trim.write(new File("...\\someOutput.bmp")); } } 
+7
source share

For Android users, here is an example using Mike Kwan Answer:

  public static Bitmap TrimImage(Bitmap bmp) { int imgHeight = bmp.getHeight(); int imgWidth = bmp.getWidth(); //TRIM WIDTH int widthStart = imgWidth; int widthEnd = 0; for(int i = 0; i < imgHeight; i++) { for(int j = imgWidth - 1; j >= 0; j--) { if(bmp.getPixel(j, i) != Color.TRANSPARENT && j < widthStart) { widthStart = j; } if(bmp.getPixel(j, i) != Color.TRANSPARENT && j > widthEnd) { widthEnd = j; break; } } } //TRIM HEIGHT int heightStart = imgHeight; int heightEnd = 0; for(int i = 0; i < imgWidth; i++) { for(int j = imgHeight - 1; j >= 0; j--) { if(bmp.getPixel(i, j) != Color.TRANSPARENT && j < heightStart) { heightStart = j; } if(bmp.getPixel(i, j) != Color.TRANSPARENT && j > heightEnd) { heightEnd = j; break; } } } int finalWidth = widthEnd - widthStart; int finalHeight = heightEnd - heightStart; return Bitmap.createBitmap(bmp, widthStart,heightStart,finalWidth, finalHeight); } 

Hope this helps someone :)

EDIT:

Guys, I just updated my answer because the last code just cropped the end of the image, not the beginning. This works great :)

+6
source share

All Articles