2009-06-17 103 views
10

我已经加载了一个jpg图像,我想绘制字母和圆,给定一个x,y坐标。如何通过Java编辑JPG图像?

我一直在试图找出ImageIcon

public void paintIcon(Component c, 
         Graphics g, 
         int x, 
         int y) 

请问这个方法让我编辑JPG图片的的paintIcon我想要的方式?什么是组件c和图形g参数?我会在它的身体上添加什么来画圈或字母?

我正在Netbeans 6.5上工作,我有什么内置的任务(而不是ImageIcon)吗?

回答

15

纯Java的方法是使用ImageIOload的图像作为BufferedImage。然后您可以拨打createGraphics()获取Graphics2D对象;然后你可以在图像上绘制任何你想要的东西。

您可以使用嵌入在JLabelImageIcon做展示,你可以,如果你想允许用户编辑图像添加MouseListener和/或MouseMotionListenerJLabel

5

使用库来做到这一点。一个你可能会尝试的是JMagick

1

我imagen你可以使用这种方法覆盖你需要的元素,每次在UI中绘制图像时(这会发生无数次,因为你不是在自己的图像数据上绘制),但可能适合你的目的(并且如果覆盖层随时间变化则是有利的)。

喜欢的东西:

new ImageIcon("someUrl.png"){ 
    public void paintIcon(Component c, Graphics g, int x, int y) { 
     super(c, g, x, y); 
     g.translate(x, y); 

     g.drawOval(0, 0, 10, 10); 
     ... 

     g.translate(-x, -y); 
    } 
}; 

话虽如此,mmyers'答案是好多了,如果你要修改的图像数据。

9

用Java处理图像可以通过使用GraphicsGraphics2D上下文来实现。

可以使用ImageIO类加载图像,如JPEG和PNG。 ImageIO.read方法需要File来读入并返回BufferedImage,该文件可用于通过其Graphics2D(或Graphics,其超类)上下文操纵图像。

Graphics2D上下文可用于执行许多图像绘制和操作任务。有关信息和示例,The Java TutorialsTrail: 2D Graphics将是一个非常好的开始。

下面是一个简化的示例(未测试的),这将打开一个JPEG文件,并得出一些圆和线(例外被忽略):

// Open a JPEG file, load into a BufferedImage. 
BufferedImage img = ImageIO.read(new File("image.jpg")); 

// Obtain the Graphics2D context associated with the BufferedImage. 
Graphics2D g = img.createGraphics(); 

// Draw on the BufferedImage via the graphics context. 
int x = 10; 
int y = 10; 
int width = 10; 
int height = 10; 
g.drawOval(x, y, width, height); 

g.drawLine(0, 0, 50, 50); 

// Clean up -- dispose the graphics context that was created. 
g.dispose(); 

上面的代码将打开一个JPEG图像,并且绘制一个椭圆形和一条线。一旦执行这些操作来操纵图像,BufferedImage可以像任何其他Image一样处理,因为它是Image的子类。

例如,通过使用BufferedImage创建ImageIcon,一个可以嵌入图像分割为JButtonJLabel

JLabel l = new JLabel("Label with image", new ImageIcon(img)); 
JButton b = new JButton("Button with image", new ImageIcon(img)); 

JLabelJButton都具有其采取在ImageIcon构造,所以,可以是一个简单的方法将图像添加到一个Swing组件。