Cách dễ nhất để tự động cắt đường viền màu trắng ra khỏi hình ảnh bằng java là gì? Cảm ơn trước ...Làm thế nào để tự động cắt một đường viền màu trắng hình ảnh trong Java?
Trả lời
Nếu bạn muốn các phần màu trắng ẩn, cách tốt nhất là sử dụng bộ lọc ảnh và làm cho các pixel trắng trong suốt, nó là discussed here bởi @PhiLho với một số mẫu tốt, nếu bạn muốn thay đổi kích thước hình ảnh của bạn nên đường viền của nó sẽ không có màu trắng, bạn có thể làm điều đó với bốn vòng đơn giản, phương pháp nhỏ này mà tôi đã viết cho bạn, hãy lưu ý rằng nó chỉ cắt phần trên của hình ảnh, bạn có thể viết nghỉ ngơi,
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 ;
}
đây là một cách để cắt tất cả 4 phía, bằng cách sử dụng màu sắc từ các điểm ảnh trên cùng bên trái làm cơ sở, và cho phép dung sai của biến đổi màu sắc để tiếng ồn trong im tuổi sẽ không làm cho cây trồng vô dụng
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<height; y++) {
for(int x=0; x<width; x++) {
if (colorWithinTolerance(baseColor, source.getRGB(x, y), tolerance)) {
if (x < topX) topX = x;
if (y < topY) topY = y;
if (x > 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);
}
Hoàn hảo! Cảm ơn rất nhiều! – mbelow
dung sai này có nghĩa là gì? –
Dung sai cho phép hình ảnh không có màu nền hoàn toàn chắc chắn vẫn bị cắt. Ví dụ: nếu bạn quét một bản vẽ từ một tờ giấy, giấy sẽ không hiển thị dưới dạng màu trắng chính xác, nhưng thay vào đó sẽ bao gồm một dải màu gần màu trắng. Nếu bạn cố gắng cắt chỉ bằng cách kết hợp một màu cụ thể của màu trắng, ít (nếu có) sẽ bị cắt. Bằng cách cho phép một số biến thể về màu sắc của nền bị cắt, nó có thể loại bỏ tất cả các nền xung quanh không cần thiết và để lại cho bạn chỉ với bản vẽ. – Todd
Và đây chỉ là một ví dụ
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);
}
- 1. Thứ tự màu đường viền
- 2. Đường viền hình ảnh hộp màu jquery
- 3. Làm thế nào để sử dụng một hình ảnh cho một đường viền trong CSS
- 4. Cắt đường viền của hình ảnh dựa trên màu sắc trong cửa sổ điện thoại
- 5. Đường viền màu trắng xung quanh GroupBox
- 6. Xóa đường viền màu đen xung quanh một hình ảnh
- 7. Làm thế nào để tạo viền trắng xung quanh bitmap?
- 8. Photoshop - cách thêm đường viền màu trắng xung quanh hình ảnh mục tiêu của tôi
- 9. Làm thế nào để tạo ra một hình ảnh màu trắng trong Python?
- 10. Làm thế nào để cắt một hình ảnh trong vb.net?
- 11. Làm thế nào để cắt một hình ảnh trong Android?
- 12. cụm Phát hiện các điểm ảnh màu trắng trong một hình ảnh sử dụng OpenCV
- 13. Màu đường viền NSView
- 14. Làm mờ đường viền hình ảnh trong một lần xem hình ảnh
- 15. Cắt hình ảnh không gian trắng tự động bằng cách sử dụng jQuery
- 16. Java OpenCV deskewing một đường viền
- 17. iOS: Cách cắt hình ảnh thành các phần hữu ích (xóa đường viền trong suốt)
- 18. Hai đường viền màu
- 19. Làm thế nào tôi có thể cắt không gian màu trắng từ một biến trong awk?
- 20. làm thế nào để làm cho hình ảnh màu sắc sang màu đen và trắng trong Android
- 21. Làm thế nào để loại bỏ viền trắng xung quanh một số đồ thị Mathematica
- 22. Android tự động cắt máy ảnh chụp ảnh
- 23. Làm cách nào để xóa đường viền xung quanh hình ảnh bị hỏng trong webkit?
- 24. Làm cách nào để đặt đường viền xung quanh hình ảnh trong WPF?
- 25. Cách đặt đường viền màu trắng vào hình elip màu đen trong cửa sổ điện thoại 8
- 26. Làm cách nào để tạo đường viền trong UIButton?
- 27. Làm cách nào để tạo hình chữ nhật với đường viền được phác thảo?
- 28. Làm cách nào để xóa đường viền ButtonChrome (khi xác định mẫu của đường viền)?
- 29. NSStatusItem và hình ảnh được đánh dấu màu trắng
- 30. Xóa đường viền xung quanh hình ảnh sprite trong Chrome
Hãy thử điều này http://stackoverflow.com/questions/273530/java-image-library-to-deskew- và-crop-images – blitzen