2013-02-13 14 views
5

Ich brauche nur ein Panel innerhalb von denen ich in der Lage wäre zu zeichnen. Ich möchte Pixel für Pixel zeichnen können.Java: Grund Plotten, Zeichnen eines Punktes/Punkt/Pixel

PS: Ich brauche keine Linien/Kreise andere Primitive. pps: die Grafikbibliothek ist nicht wirklich wichtig, es kann AWT, Swing, qt .. alles sein. Ich möchte nur etwas haben, das normalerweise von Bufferedimage dargestellt wird, oder etwas wie das, wo Sie Farben von einzelnen Pixeln festlegen und dann auf den Bildschirm rendern.

+0

Leider hat Java keine Methode zum Zeichnen eines einzelnen Punktes, stattdessen müssen Sie 'drawLine' mit einem Punkt für Start und Ende verwenden. –

+1

@ExtremeCoders: Das ist schade, und fügt das nicht einen schrecklichen Overhead hinzu? Ich möchte nur in der Lage sein, große Datensätze anzuzeigen. –

Antwort

2

von BufferedImage vertreten ..

ich BufferedImage für das vorschlagen, angezeigt ..

..oder so etwas, wo man Farben einzelner Pixel festgelegt und dann machen auf den Bildschirm.

..in einem JLabel - wie in this answer zu sehen.

Natürlich, wenn wir eine Instanz von BufferedImage haben, können wir setRGB(..).

2

Wenn Sie wirklich pixelweise rendern müssen, habe ich diese at-length für Hotspot-Visualisierung Stück Software für ein Forschungslabor geschrieben.

Was Sie wollen, ist BufferedImage.setRGB(..) - wenn Sie Pixel für Pixel zeichnen, nehme ich an, Sie haben einen Algorithmus implementiert, der die RGB-Werte für jedes Pixel rendern wird (ähnlich wie bei den Heat-Maps). Das haben wir damals in einem alten IE-kompatiblen Applet verwendet. Arbeitete wie ein Charme und wurde relativ schnell gegeben, was es tat.

Leider jedes Mal, wenn Sie die RGB-Werte direkt in einem BufferedImage manipulieren, wird es von dem Hintergrundvideospeicher nicht zwischengespeichert.

Seit Java 7 habe ich gehört, dass die zugrundeliegende J2D-Implementierung versucht, das Bild wieder in den Videospeicher zu cachen, sobald die Manipulationen aufhören und das Rendern wieder und wieder gemacht wird - zum Beispiel währenddessen werden die Heatmap gerendert wird es nicht beschleunigt, aber sobald es gerendert wird, wie Sie das Fenster herumziehen und mit der App arbeiten, können die Hintergrundbilddaten re-beschleunigt werden.

+0

danke, ich versuche etwas ähnliches zu tun - ich habe eine Reihe von Spektren (kontinuierlich in der Zeit gemessen) und ich möchte sie als 2D-Karte, Farbflecken plotten nach Intensität. Es wird also wie eine Heatmap aussehen. Aber es gibt eine Menge zu zeichnender Daten, und ich hoffe, dass ich ein intelligentes Puffer- und Thread-Laden von Daten implementieren kann, so dass wir mit einer annehmbaren Geschwindigkeit hinein-/hinauszoomen können. –

+0

@chhh - herzlich willkommen! Als wir den Zoom implementiert haben, haben wir die letzten BufferedImages bei jeder Zoomstufe behalten (damit sie nicht neu gerendert werden mussten), aber wenn die Auflösung zu hoch ist, bläst das deinen HEAP, so dass du sie als PNG schreiben kannst Disk und laden/rendern sie im laufenden Betrieb oder einen gleichwertigen Trick, wenn Sie müssen. Zumindest war es für uns noch schneller, den Frame neu zu berechnen und neu zu rendern. –

2

Ein Beispiel für eine Art und Weise, es zu tun:

// Create the new image needed 
img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 

for (int rc = 0; rc < height; rc++) { 
    for (int cc = 0; cc < width; cc++) { 
    // Set the pixel colour of the image n.b. x = cc, y = rc 
    img.setRGB(cc, rc, Color.BLACK.getRGB()); 
    }//for cols 
}//for rows 


und dann von innen überschriebene paintcomponent (Graphics g)

((Graphics2D)g).drawImage(img, <args>) 
+0

Danke, ich werde so etwas versuchen. Haben Sie etwas im Sinn, mich für weitere Informationen über diese Art von Grafiken in Java zu empfehlen? –

+0

Sie wissen das vielleicht schon, aber nur für den Fall: [http://docs.oracle.com/javase/tutorial/2d/index.html](http://docs.oracle.com/javase/tutorial/2d/ index.html) – Jool

0

Wenn Sie möchten, schnell etwas tun, können Sie einfach Verwenden Sie die Grafikmethoden setColor und drawLine. Zum Beispiel:

public void paintComponent(Graphics g) { 
    super.paintComponent(g);  

    // Set the colour of pixel (x=1, y=2) to black 
    g.setColor(Color.BLACK); 
    g.drawLine(1, 2, 1, 2); 
} 

Ich habe diese Technik verwendet und es war nicht sehr langsam. Ich habe es nicht mit der Verwendung von BufferedImage-Objekten verglichen.

0

ein wenig zu spät hier, aber man konnte es immer tun, um die Art und Weise Java-Spiel-Programmierer tun, mit einer Screen Klasse:

public class Screen { 

    private int width, height; 

    public int[] pixels; 

    public Screen(int width, int height) { 
     this.width = width; 
     this.height = height; 

     pixels = new int[width * height]; 
    } 

    public void render() { 
     for(int y = 0; y < height; y++) { 
      for(int x = 0; x < width; x++) { 
       pixels[x + y * width] = 0xFFFFFF; //make every pixel white 
      } 
     } 
    } 

public void clear() { 
      for(int i = 0; i < pixels.length; i++) { 
        pixels[i] = 0; //make every pixel black 
      } 
    } 

} 

Und dann in der Hauptklasse:

private Screen screen; 

    private BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
    private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); 

    public void render() { 
     BufferStrategy bs = getBufferStrategy(); 
     if (bs == null) { 
      createBufferStrategy(3); 
      return; 
     } 

     screen.clear(); 
     screen.render(); 

     for(int i = 0; i < pixels.length; i++) { 
      pixels[i] = screen.pixels[i]; 
     } 

     Graphics g = bs.getDrawGraphics(); 
     g.drawImage(image, 0, 0, getWidth(), getHeight(), null); 
     g.dispose(); 
     bs.show(); 
} 

Das sollte Arbeit, denke ich.