我已经加载了一个jpg图像,我想在x,y坐标下绘制字母和圆圈。
我一直试图找出ImageIcon类
的paintIconpublic void paintIcon(Component c,
Graphics g,
int x,
int y)
这种方法是否允许我按照我想要的方式编辑jpg图像?什么是组件c和图形g参数?我会在身体上添加什么来画圆圈或字母?
我正在研究Netbeans 6.5,我是否有内置任务(而不是ImageIcon)?
答案 0 :(得分:16)
纯Java方式是将ImageIO
load图像用作BufferedImage
。然后,您可以致电createGraphics()
获取Graphics2D
个对象;然后,您可以在图像上绘制任何想要的内容。
您可以使用ImageIcon
中嵌入的JLabel
进行展示,然后向MouseListener
添加MouseMotionListener
和/或JLabel
如果您尝试允许用户编辑图像。
答案 1 :(得分:11)
使用Graphics
或Graphics2D
上下文可以实现使用Java操作图像。
可以使用ImageIO
类来加载JPEG和PNG等图像。 ImageIO.read
方法需要File
才能读入并返回BufferedImage
,可用于通过Graphics2D
(或Graphics
操纵图片,它的超类)上下文。
Graphics2D
上下文可用于执行许多图像绘制和操作任务。有关信息和示例,Trail: 2D Graphics的The 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
,可以将图片嵌入JButton
或JLabel
:
JLabel
JButton
和ImageIcon
都有构造函数,它们接收{{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的答案要好得多。