2016-11-05 5 views
-1

Ich versuche, auf ein gepuffertes Bild zu zeichnen. Ich bin in der Lage, das Bild auf den Rahmen zu bekommen, aber es scheint nicht auf das Bild zu zeichnen. Wenn ichZeichnen auf einem gepufferten Bild

verwenden

BufferedImage bufferedImage = new BufferedImage(1280, 800,BufferedImage.TYPE_INT_RGB);

dann scheint es, um die Zeichenfolge zu ziehen, aber ich möchte im Idealfall auf das Bild zeichnen, wie ich einige Koordinaten auf das Bild für ein Projekt planen müssen. Jede Anleitung würde sehr geschätzt werden. Entschuldigt die schlechte Einbuchtung

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.Toolkit; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class drawTest extends JPanel { 

public void paint(Graphics g) { 
    Image img = createImageWithText(); 
    g.drawImage(img, 20,20,this); 
} 

private Image createImageWithText(){ 
    BufferedImage bufferedImage = new BufferedImage(1280, 800,BufferedImage.TYPE_INT_RGB); 
// BufferedImage bufferedImage = new BufferedImage() 
    Graphics g = bufferedImage.getGraphics(); 

    try { 
    bufferedImage = ImageIO.read(getClass().getResource("Unknown.jpg")); 

    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    g.drawString("Point is here", 20,20); 


    return bufferedImage; 
} 

    public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    double width = screenSize.getWidth(); 
    double height = screenSize.getHeight(); 
    frame.getContentPane().add(new drawTest()); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
// frame.setSize(200, 200); 

    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    System.out.println(height + " " + width); 
    frame.setVisible(true); 
} 
} 

Antwort

3

Sie zwei BufferedImage Objekte erstellen - eine, die Sie den Grafikkontext erhalten aus und ziehen Text auf, und die andere, die das Bild über ImageIO erhalten gilt, dass Sie don 't Text aufzeichnen. Sie geben das letztere zurück, daher macht es Sinn, dass das Bild keinen neuen Text enthält.

// BufferedImage Object ONE 
    BufferedImage bufferedImage = new BufferedImage(1280, 800, BufferedImage.TYPE_INT_RGB); 
    Graphics g = bufferedImage.getGraphics(); // Graphics for the first object only 

    try { 
     // BufferedImage object TWO 
     bufferedImage = ImageIO.read(getClass().getResource("Unknown.jpg")); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    // draw with the graphics context for the first object 
    g.drawString("Point is here", 20, 20); 

    return bufferedImage; // but return the second 

Lösung: tun dies nicht, nur ein BufferedImage schaffen, sagen über ImageIO, seine Graphics Kontext erhalten, mit ihm zu zeichnen, die Grafik verfügen, wenn Sie fertig, und es zurückgeben.

z.B.

// have method accept the image path and 
// have it throw an exception if the path is bad 
private Image createImageWithText2(String resourcePath) throws IOException { 

    // create one and only one BufferedImage object. 
    // If this fails, the exception will bubble up the call chain 
    BufferedImage bufferedImage = ImageIO.read(getClass().getResource(resourcePath)); 

    // get the Graphics context for this single BufferedImage object 
    Graphics g = bufferedImage.getGraphics(); 

    g.drawString("Point is here", 20, 20); 

    g.dispose(); // get rid of the Graphics context to save resources 

    return bufferedImage; 
} 

Andere mit Ihrem Code Probleme ist hier:

public void paint(Graphics g) { 
    Image img = createImageWithText(); 
    g.drawImage(img, 20,20,this); 
} 

Probleme sind:

  • Sie die falsche Malerei Methode überschrieben. Sie sollten paintComponent überschreiben, nicht paint, und in der Tat erwähnt Ihre Frage paintComponent, also bin ich mir nicht sicher, warum Sie das tun.
  • Sie überschreiben eine Malmethode, rufen aber nicht die Methode des Super-Operators auf und unterbrechen die Malkette.
  • Sie machen Datei-E/A unnötigerweise wiederholt innerhalb einer Malmethode, eine Methode, die die größte Auswirkung auf die wahrgenommene Reaktionsfähigkeit Ihrer GUI hat, und so etwas, was Sie nicht tun möchten. Lesen Sie das Bild in einmal Speichern Sie es in eine Variable, verwenden Sie die Variable in PaintComponent, und nie Datei I/O innerhalb einer Malmethode.
  • Sie wollen lernen und Java naming conventions verwenden. Variablennamen sollten alle mit einem niedrigeren Buchstaben beginnen, während Klassennamen mit einem Großbuchstaben beginnen. Wenn wir dies lernen und diesem Beispiel folgen, können wir Ihren Code besser verstehen und den Code anderer besser verstehen.
+0

Ja, ich weiß, es ist ein schlechter Code atm. Dies ist nur eine Testdatei. Ich hatte vorher noch kein gepuffertes Bild verwendet, also versuchte ich, mich darum zu kümmern. Danke dafür, aber immer noch hilfreich. Wenn es mir auch helfen könnte, das Bild zu skalieren, ohne es zu pixeln, wäre das großartig – bawa