AWT Ändern der Farbe eines BufferedImage mit Farbähnlichkeit

Diskutiere Ändern der Farbe eines BufferedImage mit Farbähnlichkeit im AWT, Swing, JavaFX & SWT Bereich.
L

liann

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?
 
I

insert2020

Ü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();
	}
 
L

liann

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
 
L

liann

Ich meinte nicht, dass sie etwas falsches zurück gibt, sondern nicht das, was ich wollte, tut mir leid falls das anders aufgenommen wurde ^^
 
Thema: 

Ändern der Farbe eines BufferedImage mit Farbähnlichkeit

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben