2016-11-05 95 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,所以我不确定你为什么要这样做。
  • 你压倒一种绘画方法,但没有调用super的方法,打破了绘画链。
  • 您在绘画方法中不必要地重复执行文件I/O,这种方法对GUI的感知响应性有最大影响,所以您不想做的事情。一旦读取图像将其存储到一个变量,使用paintComponent内的变量,并且从不在绘画方法中执行文件I/O。
  • 你会想学习和使用Java naming conventions。变量名应该全部以小写字母开头,而类名则以大写字母开头。了解这一点,并遵循这一点将使我们能够更好地理解您的代码,并让您更好地理解其他代码。
+0

是的,我知道它是一个不好的代码atm。这只是一个测试文件。我之前没有使用缓冲图像,所以试图让我的头在附近。谢谢你,但仍然有帮助。如果还可以指导我如何调整图像的大小而不使其像素化,那会很棒 – bawa