Farbverlauf erstellen ohne Javafx, AWT usw.?

bob651

Aktives Mitglied
Hai,

ich hab einen Code, der ein Bild erzeugt. Hintergrund ist aber einfarbig.
Wie mache ich daraus einen Farbverlauf?
Meine Idee wäre es, einfach 1000de Linien zu zeichnen mit verschiedenen Farben, wäre aber nicht die beste Lösung.
Habt ihr andere Ideen?

Hier die Methode:
Code:
static int colorForRedSquareOnBlue(int x, int y) {       
        int size = 100;
      
  if (Math.abs(width / 2 - x) < size / 2 && Math.abs(height / 2 - y) < size / 2)
            return new Color(0, 255, 0).getRGB();
    
    else
            return new Color(0, 255, 200).getRGB();
       
    }
 
Hai, wo?😉
willst du es denn überhaupt nicht mit einem image machen?
dann könntest du einen farbverlauf mit deinem beforzugtem Bildbearbeitungsprogramm erstellen, und 'ganz hinten einfügen'.
Das ist auf jedenfall angenehmer.🙂
 
na da 😀
hm, ne, das wäre irgendwie geschummelt :O
kann ich diese Methode nicht irgendwie verändern, um mein Ziel zu erreichen?

Code:
for (int i = 1; i < 255; i++) {
  float h = i / 255F;
  Color color = new Color(Color.HSBtoRGB(h, 1f, 1f));
  ...
}

damit bekommt man doch alle Farben. Wie bekomme ich diese Schleife in meine Methode rein? ODer hast du eine einfachere Idee?
Thx
 
Also..
ich hab vor langer zeit mal eine Methode geschrieben, die mir einen Farbverlauf in ein png file zeichnet.
Wenn du willst, kann ich dir die mal hier rein stellen und du änderst sie deinen Bedürfnissen nach um?

Java:
    int w = 640;
    int h = 480;

    BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    DataBufferInt buffer = (DataBufferInt) img.getRaster().getDataBuffer();
    int[] pixels = buffer.getData();

    int wHalf = w / 2;
   
    for (int x = 0; x < w; x++) {
      for (int y = 0; y < h; y++) {
       
        int pos = x + y * w;
        float fade = 0.0f;
        Color source = null;
        Color target = null;

        if (x < wHalf) {
          fade = x / (float) wHalf;
          source = Color.WHITE;
          target = Color.YELLOW;
        } else {
          fade = (x - wHalf) / (float) wHalf;
          source = Color.YELLOW;
          target = Color.RED;
        }

        int sR = source.getRed();
        int sG = source.getGreen();
        int sB = source.getBlue();

        int deltaR = sR - target.getRed();
        int deltaG = sG - target.getGreen();
        int deltaB = sB - target.getBlue();

        int newR = (int) (sR - deltaR * fade);
        int newG = (int) (sG - deltaG * fade);
        int newB = (int) (sB - deltaB * fade);

        int rgb = ((newR & 0xFF) << 16) | ((newG & 0xFF) << 8) | ((newB & 0xFF) << 0);
       
        pixels[pos] = rgb;
      }
    }
    ImageIO.write(img, "png", new File("D:/gradient.png"));
  }
 
Vielleicht so:

Java:
for(int y =0; y < height;y++) {
    for(int x = 0; x < width; x++) {
        int pos = y * width + x;
        
        int r,g,b;

        r = ( 255 * x + 255 * (width-1-x);
        g = r;
        b = ( 0 * x + 255 * (width-1-x);

        pixel[pos] = 0xFF000000\(r<<16)\(g<<8)\b;
    }
}
Das hab ich mal geschrieben, ist ein farbverlauf von weiß nach gelb (glaube ich).
 
Zuletzt bearbeitet:
Vielleicht so:

Java:
for(int y =0; y < height;y++) {
    for(int x = 0; x < width; x++) {
        int pos = y * width + x;
       
        int r,g,b;

        r = ( 255 * x + 255 * (width-1-x);
        g = r;
        b = ( 0 * x + 255 * (width-1-x);

        pixel[pos] = 0xFF000000\(r<<16)\(g<<8)\b;
    }
}
Das hab ich mal geschrieben, ist ein farbverlauf von weiß nach gelb (glaube ich).

der backslash soll kein \ sein sondern ein senkrechter strich.
 
danke für eure mühe, ich kriegs einfach nicht hin.. ich muss glaub ich ne nacht drüber schlafen.

EDIT; hi Salo, also mit deiner Methode bekomme ich zwar einen Verlauf, aber er bricht in der Mitte ab und beginnt erneut von grün zu blau.
 
Zuletzt bearbeitet:
danke für eure mühe,😉 kriegs einfach nicht hin.. ich muss glaub ich ne nacht drüber schlafen.

EDIT; hi Salo, also mit deiner Methode bekomme ich zwar einen Verlauf, aber er bricht in der Mitte ab und beginnt erneut von grün zu blau.

Dann stimmt irgendeine Zahl oder Variable nicht, muss morgen nochmal drübergucken.

EDIT: Oder du hast villeicht irgendwas falsch umgebaut. Villeicht kannst du den Code mal posten?!?😉
 
Zuletzt bearbeitet:
Code:
static int verlauf1(int x, int y) {      
//        int size = 100;     
//        if (Math.abs(width / 2 - x) < size / 2 && Math.abs(height / 2 - y) < size / 2)
//            return new Color(0,0, 0).getRGB();
//        else
//            return new Color(0, 100, 50).getRGB();
       
      
        int r,g,b;
            r = ( 255 * x + 255 * (width-1-x));
            g = r;
            b = (0 * x + 255 * (width-1-x));
            return  b;
            } }

Hab return b; genommen, da ich nicht weiß, wie ich alle 3 returnen kann.
In dieser Methode wird der Farbwert errechnet. Vielleicht sollte ich deinen Code in die Main Methode reintun?

Code:
public static void main(String[] args) {
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        for (int x = 0; x != width; x++) {
            for (int y = 0; y != height; y++) {
                image.setRGB(x, y, verlauf1(x, y));

OK, in die Main hab ich es getan, klappt nicht. Glaube es liegt am return. Oder?
 
schon probiert und zwar so
Code:
int [] r=new int [3];
            r[0] = ( 255 * x + 255 * (width-1-x));
            r[1] = 1;
           r [2]= (0 * x + 255 * (width-1-x));
         
            return  r;

Edit: Bin auf eine heiße Spur gestoßen 😀 Mal sehen ob es klappt
 
damn, leider nicht geklappt. Hab das so versucht:
Code:
int r = 255 ;       
        int b = 0;
        int g = 0;
        for (int i = 1; i < 255; i++) {
        r--;
        b++;
...

else
            return new Color(r,g,b).getRGB();
        }
Leider entsteht nur eine Farbe, kein Verlauf. Es müsste die Farbe speichern, dann r-- und dann den neuen Wert erneut aufzeichnen-.- HMMM
 
Ich hab mal etwas gegoogelt und bei StackOverflow nachgelesen. Bin auf das Stichwort: Lineare Interpolation gestoßen. Ich weiss nicht, ob es so gedacht ist, aber man könnte z.B. so etwas machen:

Code:
public Color[] createGradient(Color start, Color end, int nColors)
{
	double percentage = 1.0;
	Color[] gradient = new Color[nColors];
	
	double stepping = percentage / nColors;
	for(int i = 0; i < gradient.length; i++)
	{
		gradient[i] = new Color(
				(int)Math.min(255, (start.getRed() * percentage + end.getRed() * (1 - percentage))),
				(int)Math.min(255, (start.getGreen() * percentage + end.getGreen() * (1 - percentage))),
				(int)Math.min(255, (start.getBlue() * percentage + end.getBlue() * (1 - percentage)))
				);
		
		percentage = Math.max(0.0, percentage - stepping);
	}
	
	return gradient;
}

Um mehrere Farb Objekte zu bekommen habe ich einfach in jedem durchgang den Prozent Operator verringert. Vielleicht weiß jemand wie man es besser machen kann. Bzw machen sollte?
 
die habe ich nicht mehr.. seit gestern hab ich zu viel rumgespielt...🙁 bin quasi im Kreis gelaufen


Code:
static int colo12(int x, int y) {    
        int size = 100;
        int r = 250,g = 250,b = 250;

//        quadratfarbe
        if (Math.abs(width / 2 - x) < size / 2 && Math.abs(height / 2 - y) < size / 2)
            return new Color(0, 100, 50).getRGB();
    

//        hintergrundfarbe
        else
            return new Color(r,g,b).getRGB();


habe jetzt return new Color(r,g,b)
Jetzt kann ich dich bei int r,g,b= "Algorithmus" einsetzen, dass die Farbe immer heller macht.. aber mit deinem Lösungsweg steht da, dass es außerhalb der Farbreichweite ist, also über 255


EDIT:
ich glaube hier ist der Hacken:
Code:
if (Math.abs(width / 2 - x) < size / 2 && Math.abs(height / 2 - y) < size / 2)
            return new Color(0, 100, 50).getRGB();
 
Zuletzt bearbeitet:
damn, leider nicht geklappt. Hab das so versucht:
Code:
int r = 255 ;     
        int b = 0;
        int g = 0;
        for (int i = 1; i < 255; i++) {
        r--;
        b++;
...

else
            return new Color(r,g,b).getRGB();
        }
Leider entsteht nur eine Farbe, kein Verlauf. Es müsste die Farbe speichern, dann r-- und dann den neuen Wert erneut aufzeichnen-.- HMMM
Du kannst es ja wie vorhin machen, man muss die methode pro pixel 1 mal aufrufen. Dann übergibt man der Methode die x und y koordinaten.

EDIT: Sorry, hab deinen Post übersehen.
 
also ist der code oben teilweise richtig? wie übergebe ich die x koordinaten :=)
also R wird ja immer -- gemacht, aber nur einmal halt. ich müsste es ja in eine schleife packen und für jeden pixel einen wert berechnen, oder?
 
also ist der code oben teilweise richtig? wie übergebe ich die x koordinaten :=)
also R wird ja immer -- gemacht, aber nur einmal halt. ich müsste es ja in eine schleife packen und für jeden pixel einen wert berechnen, oder?
Um die dann fertige methode zu benutzen, musst du 2 schleifen machen. Eine für x, eine andere für y.
Oder was meinst du?
Ich glaube nicht, das die Methode so richtig ist, weil, so weit ich erkennen kann, do nur zwischen 2 farben wählst, oder ist das nicht die ganze Methode?
 
Zuletzt bearbeitet:
doch, das ist meine static int methode. hab nur die und meine main.
kannst du mir mal sagen, wo ich die schleifen methode reintun soll? hab irgendwie keinen plan mehr
 
Ich würde gar keine neue methode mehr schreiben, sondern die doppelte for- Schleife in die main methode reinmachen.
Ich hoffe, du schaffst es jetzt mit dem ganzen Codegeschnipsel etwas ordentliches zu stande zu bringen.😀😀
 
ich hab schon ne doppelte for schleife in der main.. hier:
Code:
for (int x = 0; x != width; x++) {
            for (int y = 0; y != height; y++) {
                image.setRGB(x, y, color12(x, y));
            }

color12 berechnet die farben..

hast du noch ne idee ? xD
 
kein verlauf, sonst schon
also mein code funktioniert, es erstellt ein viereck in der mitte und ein einfarbiges hintergrund. ich will, dass es einen verlauf hat(hintergrund). das ist mein problem :/

static int color12 :
Jeder Pixel, der in X- und in Y-Richtung weniger als 50 Pixel vom Zentrum entfernt liegt, wird rot eingefärbt, alle anderen Pixel erhalten die Hintergrundfarbe.
Code:
static int colorForRedSquareOnBlue(int x, int y) {
int size = 50;
if (Math.abs(width / 2 - x) < size  && Math.abs(height / 2 - y) < size )

return new Color(r,g,b).getRGB();

else
            return new Color(0,0,255).getRGB();
    }


also ich muss quasi color12 ändern, aber keine ideen mehr:/ du vlt? 😀
 
Das ist immer immer immer ganz schlecht.
Aber wenn dus nicht so hinbekommst, dann nimm doch die schon fertige klassen, und zeichne dann eben ein rechteck drauf.
 
den kompletten, ok mom

Code:
public class Ball {

    static String    name    = "a01.png";
    static int        width    = 480;
    static int        height    = 270;

    public static void main(String[] args) {
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        for (int x = 0; x != width; x++) {
            for (int y = 0; y != height; y++) {
                image.setRGB(x, y, color12(x, y));
            }
        }

        try {
            File outputfile = new File(name);
            ImageIO.write(image, "png", outputfile);
            System.out.println("Wrote image: " + name);
        } catch (IOException e) {
            System.out.println("Something went wrong: " + e);
        }
    }
  

  
  
  
  
  
    static int color12(int x, int y) {
        int size = 50;



    //      quadratfarbe
  
if (Math.abs(width / 2 - x) < size  && Math.abs(height / 2 - y) < size )

            return new Color(255,255,255).getRGB();
  
        else
//            hintergrundfarbe
            return new Color(0,0,255).getRGB();
    }
        }
ZIEL: Ich versuchte eine Farbverlauf im Hintergrund. Habe es irgendwann zufällig geschafft gehabt, aber mein Rechteck war weg. Naja ich versuch mich mal an einer anderen Aufgabe 😀
 
Zuletzt bearbeitet:
Schau mal hier vorbei: http://www.java-forum.org/thema/sich-aendernde-farbverlaeufe-erstellen.173147/#post-1091283

In diesem Thema wollte ich auch schonmal wissen, wie das mit Farbverläufen gut funktioniert. Und am Ende hat es auch toll funktioniert. Ich habe dann meinen Beitrag selbst kommentiert und meine Lösung darunter geschrieben. Kannst es dir ja mal anschauen. Nicht wundern: Diese ganzen if-Anfragen sind nur dafür da, dass sich der Farbverlauf kontinuierlich und flüssig ändert, denn das wollte ich auch noch machen. Aber ansonsten glaube ich könnte dir das helfen.
Besonders dieser Code hier, der auch in meinem Beitrag steht:
Code:
// Diese Methode zeichnet den Farbverlauf
public void zeichneFarbverlauf(Graphics g, Color farbe1, Color farbe2) {
        Graphics2D g2d = (Graphics2D) g.create();
        GradientPaint gp = new GradientPaint(300 / 2, 0, farbe1, 300 / 2, 600, farbe2);
        g2d.setPaint(gp);
        g2d.fillRect(800, 0, 300, 600);
    }
 

Neue Themen


Zurück
Oben