Crop/trim a JPG file with empty space with Java

后端 未结 2 1887
陌清茗
陌清茗 2020-12-16 02:42

Is there a framework which is able to remove the white space (rectangular) of an image. We create Image Thumbnails from technical drawings which are unfortunately in PDF for

相关标签:
2条回答
  • 2020-12-16 03:13

    It can be done in JAI as is demonstrated in this thread. Or here's some Java code I just wrote which can be used to do it:

    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"));
        }
    }
    
    0 讨论(0)
  • 2020-12-16 03:26

    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 help someone :)

    EDIT:

    Guys, I just updated my answer cuz last code was just trimming the end of the image, not the beginning. This one is working just great :)

    0 讨论(0)
提交回复
热议问题