Jaki jest najprostszy sposób automatycznego przycinania białej ramki z obrazka w java? Z góry dzięki ...Jak automatycznie przyciąć białą ramkę obrazu w Javie?
Odpowiedz
Jeśli chcesz, aby białe części były niewidoczne, najlepiej użyć filtrów obrazu i uczynić białe piksele przezroczystym, to jest discussed here autorki @PhiLho z kilkoma dobrymi próbkami, , jeśli chcesz zmienić rozmiar twój obrazek, więc jego granice nie będą miały białych kolorów, możesz to zrobić za pomocą czterech prostych pętli, ta mała metoda, którą napisałem dla ciebie, robi sztuczkę, zauważ, że po prostu przycina górną część obrazu, możesz napisać reszta,
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 ;
}
Oto sposób przyciąć wszystkich 4 stron, z użyciem koloru z bardzo lewego górnego piksela jako linii bazowej, i pozwolić na tolerowanie wariacji kolorów, tak aby hałas w IM wiek nie będzie upraw bezużyteczną
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);
}
Idealne! Dziękuję bardzo! – mbelow
co oznacza ta tolerancja? –
Tolerancja pozwala na przycinanie obrazów bez idealnie jednolitego koloru tła. Na przykład, jeśli zeskanujesz rysunek z kartki papieru, papier nie pojawi się jako biały, ale będzie składał się z zakresu kolorów zbliżonych do białego. Jeśli próbowałeś przyciąć, dopasowując jeden konkretny kolor bieli, małe (jeśli w ogóle) byłyby przycięte. Pozwalając na zmianę koloru przycinanego tła, można usunąć całe niepotrzebne otoczenie i pozostawić tylko rysunek. – Todd
I tu właśnie kolejny przykład
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. Jak przyciąć spację białą ze wszystkich elementów w tablicy?
- 2. Jak przyciąć brak przerw w Javie?
- 3. iOS: Jak przyciąć obraz do użytecznych części (usunąć przezroczystą ramkę)
- 4. Jak przyciąć prostokąt z obrazu w Androidzie
- 5. Jak mogę usunąć białą ramkę z wykresu kołowego HighCharts?
- 6. Wygeneruj gładką białą obwódkę wokół okrągłego obrazu
- 7. Jak uzyskać wyświetlaną ramkę obrazu z UIImageView?
- 8. Nie można przyciąć obrazu przy użyciu mini_magick
- 9. Jak przyciąć ogromny obraz
- 10. Jak dodać ramkę obrazu i wstawić tekst na obrazie?
- 11. Uzyskiwanie obrazu Mathematica w Javie
- 12. Jak usunąć białą przestrzeń od początku ciągu?
- 13. Zmiana rozmiaru obrazu w Javie w celu zmniejszenia rozmiaru obrazu
- 14. Jak przyciąć obraz w vb.net?
- 15. Jak przyciąć tekst w Angular2?
- 16. Jak ustawić ramkę cell.imageview
- 17. iOS 10: Niestandardowy obraz tła UITabBar tworzy ramkę u góry obrazu. Jak mogę go usunąć?
- 18. Jak umieścić białą obwódkę Black elipsy w Windows Phone 8
- 19. Ustawienie obrazu BufferedImage na kolor w Javie
- 20. Skalowanie SVG w Javie
- 21. Jak uczynić separator w read_csv bardziej elastyczną białą spacją?
- 22. Czytanie tekstu z pliku obrazu w Javie
- 23. Resize obrazu przy zachowaniu proporcji w Javie
- 24. Jak przyciąć i zmienić rozmiar obrazu w jednym kroku w .NET
- 25. Jak automatycznie wcięcić kod źródłowy?
- 26. Jak przyciąć obraz za pomocą obróconego prostokąta?
- 27. Jak utworzyć ścieżkę clipclogu z obrazu?
- 28. Symfony produkuje białą stronę
- 29. Jak mogę usunąć metadane z obrazu JPEG w Javie?
- 30. SVG - Jak przyciąć zdjęcie do koła?
spróbować tej http://stackoverflow.com/questions/273530/java-image-library-to-deskew- i-crop-obrazy – blitzen