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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| public class Histogramme extends JComponent {
private static final long serialVersionUID = 1L;
private BufferedImage image, histogramme;
private final int largeur = 256;
private final int hauteur = 200;
private final int[] rouge = new int[256];
private final int[] vert = new int[256];
private final int[] bleu = new int[256];
private int minBleu; // la valeur de seuil pour le bleu
private int minRouge; // la valeur de seuil pour le rouge
private int minVert; // la valeur de seuil pour le vert
public Histogramme(BufferedImage monImage){
image = monImage;
récupérerRVB();
tracerHistogrammes();
}
public void setMinBleu(int minBleu) {
this.minBleu=minBleu;
repaint(); // provoque un redessin
}
public void setMinRouge(int minRouge) {
this.minRouge=minRouge;
repaint(); // provoque un redessin
}
public void setMinVert(int minVert) {
this.minVert=minVert;
repaint(); // provoque un redessin
}
protected void paintComponent(Graphics surface) {
// surface.drawImage(image, 0, 0, null);
surface.drawImage(histogramme,100, 100, null);
}
private void récupérerRVB() {
Raster trame = image.getRaster();
int[] rgb = new int[3];
int maximum = 0;
for (int y=0; y<image.getHeight(); y++)
for (int x=0; x<image.getWidth(); x++) {
trame.getPixel(x, y, rgb);
rouge[rgb[0]]++;
vert[rgb[1]]++;
bleu[rgb[2]]++;
}
}
private void tracerHistogrammes() {
histogramme = new BufferedImage(largeur, hauteur, BufferedImage.TYPE_INT_ARGB);
Graphics2D dessin = histogramme.createGraphics();
Rectangle2D rectangle = new Rectangle2D.Double(0, 0, largeur-1, hauteur-1);
// ne sert strictement à rien dessin.draw(rectangle);
dessin.setPaint(new Color(1F, 1F, 1F, 0.2F));
dessin.fill(rectangle);
changerAxes(dessin);
dessin.setPaint(new Color(1F, 0F, 0F, 0.4F));
tracerHistogramme(dessin, rouge, minRouge);
dessin.setPaint(new Color(0F, 1F, 0F, 0.4F));
tracerHistogramme(dessin, vert, minVert);
dessin.setPaint(new Color(0F, 0F, 1F, 0.4F));
tracerHistogramme(dessin, bleu, minBleu);
dessin.dispose(); // toujours disposer après utilisation
}
private void changerAxes(Graphics2D dessin) {
dessin.translate(0, hauteur);
double surfaceImage = image.getWidth()*image.getHeight();
double surfaceHistogramme = histogramme.getWidth()*histogramme.getHeight();
dessin.scale(1, -surfaceHistogramme/surfaceImage/3.7);
}
private void tracerHistogramme(Graphics2D dessin, int[] couleur, int min) {
for (int i=0; i<255; i++)
if ( couleur[i]>min ) { // par exemple (je ne sais pas en quoi la valeur du slider est censée intervenir dans ton dessin, mais ça ressemble à ça dans ton dernier code)
dessin.drawLine(i, 0, i, couleur[i]);
}
}
} |
Partager