2016-10-17 5 views
0

also habe ich ein kleines Problem und ich versuche es seit Stunden zu lösen. Ich habe ein BufferedImage und ich möchte die Farbe auf eine fließende Weise ändern, z. von rot zu weiß. Mein Haupt:Wie erstelle ich einen Farbverlauf ohne Javafx/AWT?

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 { 
     ,,, 

Meine Methode, um die Farbe zu ändern:

static int color12(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(255, 0, 0).getRGB(); 
    else 
     return new Color(200, 200, 255).getRGB(); 
} 

}

Also spielte ich um mit der Methode, aber ich kann es nicht getan. Meine beste "Lösung" war:

int r = 0 ;  
    int b = 0; 
    int g = 0; 
    for (int i = 1; i < 255; i++) 
r++; 

sonst zurückkehren neue Farbe (r, g, b) .getRGB();

Kann mir jemand helfen?

Antwort

1

Ich bin nicht sicher, wie Sie den Gradienten (z. B. horizontal, vertikal oder diagonal) wollen, aber hier ist ein Beispiel mit linearer Interpolation für eine horizontale oder vertikale Steigung.

import java.awt.Color; 
import java.awt.image.BufferedImage; 
import javax.swing.BoxLayout; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 

public class ExampleFrame extends JFrame { 

    private static enum GradientOrientation { 
     HORIZONTAL, VERTICAL 
    }; 

    private static BufferedImage createGradientImg(int width, int height, Color startColor, Color endColor, GradientOrientation o) { 
     BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
     for (int x = 0; x < width; x++) { 
      for (int y = 0; y < height; y++) { 
       int pos = o.equals(GradientOrientation.HORIZONTAL) ? x : y; 
       int size = o.equals(GradientOrientation.HORIZONTAL) ? width : height; 
       image.setRGB(x, y, getGradientRGB(startColor, endColor, pos, size)); 
      } 
     } 
     return image; 
    } 

    private static int getGradientRGB(Color startColor, Color endColor, int pos, int size) { 
     double perc = (double) pos/size; 
     int newRed = (int) (endColor.getRed() * perc + startColor.getRed() * (1 - perc)); 
     int newGreen = (int) (endColor.getGreen() * perc + startColor.getGreen() * (1 - perc)); 
     int newBlue = (int) (endColor.getBlue() * perc + startColor.getBlue() * (1 - perc)); 
     return new Color(newRed, newGreen, newBlue).getRGB(); 
    } 

    public void createAndShow() { 
     BufferedImage img1 = createGradientImg(200, 100, Color.RED, 
       Color.WHITE, GradientOrientation.HORIZONTAL); 
     BufferedImage img2 = createGradientImg(200, 100, Color.BLUE, 
       Color.YELLOW, GradientOrientation.HORIZONTAL); 
     BufferedImage img3 = createGradientImg(200, 100, Color.WHITE, 
       Color.YELLOW, GradientOrientation.VERTICAL); 
     BufferedImage img4 = createGradientImg(200, 100, Color.BLACK, 
       Color.WHITE, GradientOrientation.VERTICAL); 

     BoxLayout layout = new BoxLayout(getContentPane(), BoxLayout.Y_AXIS); 
     getContentPane().setLayout(layout); 
     getContentPane().add(new JLabel(new ImageIcon(img1))); 
     getContentPane().add(new JLabel(new ImageIcon(img2))); 
     getContentPane().add(new JLabel(new ImageIcon(img3))); 
     getContentPane().add(new JLabel(new ImageIcon(img4))); 
     pack(); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       ExampleFrame ef = new ExampleFrame(); 
       ef.createAndShow(); 
      } 
     }); 
    } 
} 
+0

Aber ich möchte nicht Swing oder AWT verwenden :) ist es möglich, die Aufgabe nur mit der Bearbeitung der statischen Int-Farbmethode zu begleiten? –

+0

Ich bin nicht ganz sicher, was Sie erreichen wollen, aber Sie können Ihre 'color12()' Methode für meine 'getGradientRGB()' Methode ändern; Übergeben Sie einfach die richtigen Parameter. Die einzigen Klassen, die in meinem Beispiel zum Erstellen eines Verlaufsbildes verwendet werden, sind 'BufferedImage' und' Color' gemäß Ihrer ursprünglichen Frage. Beide sind Teil des 'awt' Pakets. Der Rest dient lediglich der Demonstration, d. H. Um es als Beispiel darzustellen, und um es als GUI anzuzeigen, müssen Sie awt/Swing/JavaFX/swt/etc verwenden. es sei denn, Sie möchten eine Bibliothek von Grund auf neu erstellen. –

+0

Hallo. Also möchte ich zum Beispiel meine Farbe so gestalten, dass sie mit Rot beginnt und von (255,0,0) bis (255,255,255) in Stufen geht. Rot bis Weiß auf fließende Weise. Meine color12-Methode erstellt bereits eine Farbe, aber nur 1, nicht viele. Ich möchte viele Farben (von rot bis weiß). Ich spielte mit der Haupt- und der Methode herum, konnte es aber nicht richtig machen. Ich denke, ich muss nur eine for oder while-Methode in color12 hinzufügen, aber ich bin nicht sicher .. vielleicht verstehst du mich jetzt (sry ich weiß es ist schwer, weil mein Englisch nicht fließend ist) –

Verwandte Themen