2016-11-05 3 views
-1

J'essaie de dessiner sur une image mise en mémoire tampon. Je suis en mesure d'obtenir l'image sur le cadre, mais il ne semble pas tirer sur l'image. Si j'utiliseDessin sur une image mise en mémoire tampon

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

il semble dessiner la chaîne mais je voudrais attirer idéalement sur l'image que je dois tracer des coordonnées sur l'image pour un projet. Toute orientation serait très appréciée. Excusez la mauvaise indentation

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); 
} 
} 

Répondre

3

Vous créez deux objets BufferedImage - celui que vous obtenez le contexte graphique de et dessiner le texte sur, et l'autre qui tient l'image obtenue par ImageIO, que vous don 't dessine du texte sur. Vous retournez ce dernier, il est donc logique que l'image ne contient aucun nouveau texte.

// 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 

Solution: ne faites pas cela, créez un BufferedImage seulement, dire via ImageIO, obtenir son contexte graphique, de dessiner avec elle, les graphiques disposer lorsque vous avez terminé, et le retourner.

par exemple,

// 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; 
} 

D'autres problèmes avec votre code est ici:

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

problèmes comprennent:

  • Vous surchargeons la mauvaise méthode de peinture. Vous devriez remplacer paintComponent, pas peindre, et en fait votre question mentionne paintComponent, donc je ne sais pas pourquoi vous faites cela.
  • Vous substituez une méthode de peinture mais vous n'appelez pas la méthode du super, ce qui brise la chaîne de peinture.
  • Vous effectuez des E/S de fichiers inutilement à plusieurs reprises dans une méthode de peinture, une méthode qui a le plus d'effet sur la réactivité perçue de votre interface graphique, et donc quelque chose que vous ne voulez pas faire. Lisez l'image dans une fois stockez-la dans une variable, utilisez la variable dans paintComponent et ne faites jamais d'E/S de fichiers dans une méthode de peinture.
  • Vous voudrez apprendre et utiliser Java naming conventions. Les noms de variable doivent tous commencer par une lettre plus basse, tandis que les noms de classe doivent être précédés d'une lettre majuscule. Apprendre cela et suivre cela nous permettra de mieux comprendre votre code, et vous permettra de mieux comprendre le code des autres.
+0

Oui, je sais que c'est un mauvais code atm. Ceci est juste un fichier de test. Je n'avais pas utilisé d'image tamponnée auparavant, alors j'essayais de la contourner. Merci pour cela, toujours utile. Si cela pouvait aussi me guider sur la façon de redimensionner l'image sans la pixelliser, ce serait génial – bawa