如何在Java中自动裁剪图像白色边框?

在java中从图像中自动裁剪白色边框的最简单方法是什么? 提前致谢…

如果你想让白色部分看不见,最好的方法是使用图像滤镜并使白色像素透明,@ PhiLho 在这里讨论一些好的样本,如果你想调整图像的大小,那么它的边框就不会有白色颜色,你可以用四个简单的循环来做,我为你写的这个小方法做了诀窍,注意它只是裁剪图像的上半部分,你可以编写其余的,

private Image getCroppedImage(String address) throws IOException{ BufferedImage source = ImageIO.read(new File(address)) ; boolean flag = false ; int upperBorder = -1 ; do{ upperBorder ++ ; for (int c1 =0 ; c1 < source.getWidth() ; c1++){ if(source.getRGB(c1, upperBorder) != Color.white.getRGB() ){ flag = true; break ; } } if (upperBorder >= source.getHeight()) flag = true ; }while(!flag) ; BufferedImage destination = new BufferedImage(source.getWidth(), source.getHeight() - upperBorder, BufferedImage.TYPE_INT_ARGB) ; destination.getGraphics().drawImage(source, 0, upperBorder*-1, null) ; return destination ; } 

这是一种裁剪所有4个边的方法,使用来自最左上角像素的颜色作为基线,并允许颜色变化的容差,以便图像中的噪声不会使裁剪无用

 public BufferedImage getCroppedImage(BufferedImage source, double tolerance) { // Get our top-left pixel color as our "baseline" for cropping int baseColor = source.getRGB(0, 0); int width = source.getWidth(); int height = source.getHeight(); int topY = Integer.MAX_VALUE, topX = Integer.MAX_VALUE; int bottomY = -1, bottomX = -1; for(int y=0; y bottomX) bottomX = x; if (y > bottomY) bottomY = y; } } } BufferedImage destination = new BufferedImage( (bottomX-topX+1), (bottomY-topY+1), BufferedImage.TYPE_INT_ARGB); destination.getGraphics().drawImage(source, 0, 0, destination.getWidth(), destination.getHeight(), topX, topY, bottomX, bottomY, null); return destination; } private boolean colorWithinTolerance(int a, int b, double tolerance) { int aAlpha = (int)((a & 0xFF000000) >>> 24); // Alpha level int aRed = (int)((a & 0x00FF0000) >>> 16); // Red level int aGreen = (int)((a & 0x0000FF00) >>> 8); // Green level int aBlue = (int)(a & 0x000000FF); // Blue level int bAlpha = (int)((b & 0xFF000000) >>> 24); // Alpha level int bRed = (int)((b & 0x00FF0000) >>> 16); // Red level int bGreen = (int)((b & 0x0000FF00) >>> 8); // Green level int bBlue = (int)(b & 0x000000FF); // Blue level double distance = Math.sqrt((aAlpha-bAlpha)*(aAlpha-bAlpha) + (aRed-bRed)*(aRed-bRed) + (aGreen-bGreen)*(aGreen-bGreen) + (aBlue-bBlue)*(aBlue-bBlue)); // 510.0 is the maximum distance between two colors // (0,0,0,0 -> 255,255,255,255) double percentAway = distance / 510.0d; return (percentAway > tolerance); } 

这里只是另一个例子

 private static BufferedImage autoCrop(BufferedImage sourceImage) { int left = 0; int right = 0; int top = 0; int bottom = 0; boolean firstFind = true; for (int x = 0; x < sourceImage.getWidth(); x++) { for (int y = 0; y < sourceImage.getWidth(); y++) { // pixel is not empty if (sourceImage.getRGB(x, y) != 0) { // we walk from left to right, thus x can be applied as left on first finding if (firstFind) { left = x; } // update right on each finding, because x can grow only right = x; // on first find apply y as top if (firstFind) { top = y; } else { // on each further find apply y to top only if a lower has been found top = Math.min(top, y); } // on first find apply y as bottom if (bottom == 0) { bottom = y; } else { // on each further find apply y to bottom only if a higher has been found bottom = Math.max(bottom, y); } firstFind = false; } } } return sourceImage.getSubimage(left, top, right - left, bottom - top); }