2016-11-05 6 views
-1

Я пытаюсь рисовать на буферизованное изображение. Я могу получить изображение на рамке, но он, похоже, не рисует изображение. Если я используюРисунок на буферизованное изображение

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

тогда, кажется, рисовать строку, но я хотел бы идеально рисовать на изображении, как мне нужно, чтобы построить некоторые координаты на изображении для проекта. Любое руководство будет высоко оценено. Извините плохой отступы

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

ответ

3

Вы создаете два объекты BufferedImage - тот, который вы получаете в графический контекст от и нарисовать текст на, а другой, который содержит изображение, полученное с помощью ImageIO, что вы дон 't нарисуйте текст на. Вы возвращаете последнее, поэтому имеет смысл, что изображение не содержит нового текста.

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

Решение: не делайте этого, создать только один BufferedImage, скажем, через ImageIO, получить его графический контекст, рисовать с ним, распоряжаться Графического когда сделано, и вернуть его.

например,

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

Другие проблемы с кодом здесь:

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

Проблемы включают в себя:

  • Вы перекрывая неправильный метод рисования. Вы должны переопределить paintComponent, а не рисовать, и на самом деле ваш вопрос упоминает paintComponent, поэтому я не уверен, почему вы это делаете.
  • Вы переопределяете метод рисования, но не называете метод супер, нарушая цепочку окраски.
  • Вы делаете ненужные операции ввода-вывода в методе рисования, метод, который оказывает наибольшее влияние на воспринимаемую отзывчивость вашего графического интерфейса и, следовательно, что-то, чего вы не хотите делать. Прочтите изображение в , как только сохраните его переменной, используйте переменную в paintComponent и никогда не делайте ввода-вывода файлов в методе рисования.
  • Вы хотите узнать и использовать Java naming conventions. Имена переменных должны начинаться с нижней буквы, а имена классов - с буквой верхнего регистра. Изучение этого и последующее это позволит нам лучше понять ваш код и позволит вам лучше понять код других.
+0

Да, я знаю его плохой код atm. Это всего лишь тестовый файл. Раньше я не использовал буферизованное изображение, поэтому пытался обвести его вокруг. Спасибо за это, хотя, по-прежнему полезно. Если бы я мог также изменить размер изображения без его пикселизации, это было бы здорово – bawa