[英]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 中的图像操作可以通过使用Graphics
或Graphics2D
上下文来实现。
可以使用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
,可以将图像嵌入到JButton
或JLabel
中:
JLabel l = new JLabel("Label with image", new ImageIcon(img));
JButton b = new JButton("Button with image", new ImageIcon(img));
JLabel
和JButton
都有接受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.