繁体   English   中英

如何通过Java编辑jpg图片?

[英]How can I edit a jpg image through Java?

我已经加载了一个 jpg 图像,我想在其中绘制字母和圆圈,给定 ax,y 坐标。

我一直想弄清楚ImageIcon class的paintIcon

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

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

我正在研究 Netbeans 6.5,我是否有任何用于此任务的内置程序(而不是 ImageIcon)?

纯 Java 方法是使用ImageIO将图像加载BufferedImage 然后你可以调用createGraphics()得到一个Graphics2D object; 然后你可以在图像上绘制任何你想要的东西。

您可以使用JLabel中嵌入的ImageIcon来进行显示,如果您试图允许用户编辑图像,则可以将MouseListener和/或MouseMotionListener添加到JLabel

Java 中的图像操作可以通过使用GraphicsGraphics2D上下文来实现。

可以使用ImageIO class 加载 JPEG 和 PNG 等图像。 ImageIO.read方法接受一个File来读入并返回一个BufferedImage ,它可用于通过其Graphics2D (或Graphics ,其超类)上下文。

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

以下是一个简化的示例(未经测试),它将打开一个 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 图像,并绘制一个椭圆和一条线。 一旦执行了这些操作来操纵图像,就可以像处理任何其他Image一样处理BufferedImage ,因为它是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 组件的一种简单方法。

使用图书馆来做到这一点。 您可以尝试的一个是JMagick

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM