1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| /**
* Teste si une image est "en noir et blanc", c'est-à-dire si elle est
* uniquement composée de couleurs dégradées du gris
*
* @param img
* une image à tester
* @param tolerance [0.0-1.0]
* écart toléré dans la nuance de gris ; ex: TRUE si [250, 251, 250] à 1%
* @return false si au moins une couleur n'est pas dégradée du gris
*/
public static boolean isBlackAndWhite(BufferedImage img, float tolerance) {
for (int i = 0; i < img.getHeight(); i++) {
for (int j = 0; j < img.getWidth(); j++) {
Color color = new Color(img.getRGB(j, i));
if (!isBlackAndWhite(color, tolerance)) {
return false;
}
}
}
return true;
}
/**
* Teste si une couleur est "en noir et blanc", c'est-à-dire si elle est un
* dégradé de gris
*
* @param color
* une couleur à tester
* @param tolerance [0.0-1.0]
* écart toléré dans la nuance de gris ; ex: TRUE si [250, 251, 250] à 1%
* @return false si la couleur n'est pas un dégradé de gris
*/
public static boolean isBlackAndWhite(Color color, float tolerance) {
assert tolerance >= 0.0f && tolerance <= 1.0f;
float ref = avg(color.getRed(), color.getGreen(), color.getBlue()) / 255.0f;
return areSimilar(ref, color.getRed() / 255.0f, tolerance)
&& areSimilar(ref, color.getGreen() / 255.0f, tolerance)
&& areSimilar(ref, color.getBlue() / 255.0f, tolerance);
}
private static float avg(int... values) {
int sum = 0;
for (int i : values) {
sum += i;
}
return sum / values.length;
}
private static boolean areSimilar(float f1, float f2, float tolerance) {
return Math.abs(f1 - f2) <= tolerance; //DEBUG on part du principe que f1 et f2 sont positifs...
} |
Partager