AWT Ändern der Farbe eines BufferedImage mit Farbähnlichkeit

liann

Mitglied
Hallo, ich habe eine methode geschrieben, die ein neues bufferedimage zurückliefert, was von einem anderen "abgeleitet" wird.
Sprich:
Java:
 public static void drawOverImage(Graphics2D g2, Color replace, Color color, BufferedImage source) {
        for (int i = 0; i < source.getWidth(); i++)
            for (int j = 0; j < source.getHeight(); j++) {
                if (isTransparent(i, j, source))
                    continue;
                int rgb = source.getRGB(i, j);
                if (getSimilarityOf(new Color(rgb), replace) <= /* TODO */ 0.3)
                    g2.setColor(color);
                else
                    g2.setColor(new Color(rgb));
                g2.fillRect(i, j, 1, 1);
            }
    }
Ich möchte wie oben auch steht bei einer Ähnlichkeit von 30% die Farbe ändern, die Farbe ist in dem Beispiel ein weiß (ganz genau sogar). Die methode mit der Similarity ist:
Java:
 public static double getSimilarityOf(Color c, Color c1) {
        int r = c.getRed(), g = c.getGreen(), b = c.getBlue();
        double tB = sqrt(r * r + g * g + b * b) / sqrt(255 * 255 * 3);
        r = c1.getRed();
        g = c1.getGreen();
        b = c1.getBlue();
        double tB1 = sqrt(r * r + g * g + b * b) / sqrt(255 * 255 * 3);
        if (c.equals(Color.white))
            System.out.println(abs(tB - tB1));
        return abs(tB - tB1);
    }
Jedoch klappt diese methode nicht gut. 1. wird entweder ein sehr niedriger oder ein sehr hoher wert zurückgeliefert und bei weiß klappt gar nichts, weil ja 0 * x = 0 ist.
Gibt es eine bessere Methode?
 
Über HSB
Java:
	public static void showCanvas() {
		JFrame f = new JFrame();
		Canvas c = new Canvas() {
			private static final long serialVersionUID = 1L;

			private Color color = Color.white;

			private Color getSimilarityOf(Color c1) {
				float[] hsbvals = new float[3];
				Color.RGBtoHSB(c1.getRed(), c1.getGreen(), c1.getBlue(), hsbvals);
				hsbvals[0] = ((Math.round(hsbvals[0] * 100f) + 5) % 100) / 100f;
				return Color.getHSBColor(hsbvals[0], 1, 1);
			}

			@Override
			public void paint(Graphics g) {
				g.setColor((color = getSimilarityOf(color)));
				g.fillRect(0, 0, this.getWidth(), this.getHeight());
			}
		};
		f.add(c);
		f.setSize(400, 400);
		f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		f.setVisible(true);

		new Timer().schedule(new TimerTask() {
			@Override
			public void run() {
				c.repaint();
			}
		}, 0, 1000);
	}

	public static void main(String[] args) {
		showCanvas();
	}
 
private Color getSimilarityOf(Color c1) { float[] hsbvals = new float[3]; Color.RGBtoHSB(c1.getRed(), c1.getGreen(), c1.getBlue(), hsbvals); hsbvals[0] = ((Math.round(hsbvals[0] * 100f) + 5) % 100) / 100f; return Color.getHSBColor(hsbvals[0], 1, 1); }
Uhm ich weiß jetzt nicht genau, was das zurückliefert, aber ich brauche eine prozentzahl oder ähnliches.
Trotzdem Danke
 
Ich meinte nicht, dass sie etwas falsches zurück gibt, sondern nicht das, was ich wollte, tut mir leid falls das anders aufgenommen wurde ^^
 

Zurück
Oben