如何通过Java编辑jpg图像?

时间:2009-06-17 21:29:39

标签: java image netbeans

我已经加载了一个jpg图像,我想在x,y坐标下绘制字母和圆圈。

我一直试图找出ImageIcon

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

这种方法是否允许我按照我想要的方式编辑jpg图像?什么是组件c和图形g参数?我会在身体上添加什么来画圆圈或字母?

我正在研究Netbeans 6.5,我是否有内置任务(而不是ImageIcon)?

5 个答案:

答案 0 :(得分:16)

纯Java方式是将ImageIO load图像用作BufferedImage。然后,您可以致电createGraphics()获取Graphics2D个对象;然后,您可以在图像上绘制任何想要的内容。

您可以使用ImageIcon中嵌入的JLabel进行展示,然后向MouseListener添加MouseMotionListener和/或JLabel如果您尝试允许用户编辑图像。

答案 1 :(得分:11)

使用GraphicsGraphics2D上下文可以实现使用Java操作图像。

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

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

以下是一个简化示例(未经测试),它将打开一个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的子类。

例如,通过使用JLabel l = new JLabel("Label with image", new ImageIcon(img)); JButton b = new JButton("Button with image", new ImageIcon(img)); 创建ImageIcon,可以将图片嵌入JButtonJLabel

JLabel

JButtonImageIcon都有构造函数,它们接收{{1}},这样就可以轻松地将图像添加到Swing组件中。

答案 2 :(得分:5)

使用库来做到这一点。您可以尝试的是JMagick

答案 3 :(得分:2)

我使用过Java高级图像库(http://java.sun.com/products/java-media/jai/forDevelopers/jaifaq.html),但您也可以查看ImageJ(http://rsbweb.nih.gov/ij/index.html

答案 4 :(得分:1)

我想象你可以使用这种方法在每次在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的答案要好得多。