2012-10-09 32 views
3

我想弄清楚如何拍摄图像并使用Graphics2D来操纵它,同时能够在同一图像上执行多个操作(使它变暗两次会使它变暗比做一次)。我发现的每一个例子都是为了操作一次图像并显示它。我需要能够多次显示图像。例如,假设我有一个包含选项1,2,3等的菜单,其中1个变暗,2个变亮,3个显示图像。使用Graphics2D操纵图像多次

我该怎么做到这一点?我可以得到图像,使其变暗,旋转并显示它,但不能用菜单或用户选择何种方式的其他方式。如果有人可以将我链接到一个可以做到这一点的网页,或者写一个简短的(更短的更好的),一个课程程序来做我所描述的,我应该能够开始。

基本上,我需要能够做这样的事情:

initialize image; 
display(image); 
lighten(image); 

我不明白,是我如何处理与Graphics2D的图像,并将其应用到我的形象。

这是我迄今(主要来自here):

import java.awt.*; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class ShowImage extends JPanel { 
Image img; 

     public ShowImage() { 
      super(); 
      img = Toolkit.getDefaultToolkit().getImage("image.png"); 
     } 

     public void paintComponent(Graphics g) { 
      Graphics2D g2d = (Graphics2D) g; 
      g2d.translate(170, 0); 
      g2d.rotate(1); 
      g2d.drawImage(img, 0, 0, this); 
     } 

     public static void main(String arg[]) { 
      JFrame frame = new JFrame("Image Example"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setSize(600, 400); 

      ShowImage panel = new ShowImage(); 
      frame.setContentPane(panel); 
      frame.setVisible(true); 
    } 
} 

目前,我在做的paintComponent(所有的操作),所以它不是在所有容易被操纵。有没有办法让main设置的Graphics2D变量,然后以某种方式将它变成paintComponent()?我完全失去了如何去做这件事。

我试图发布链接到我查看的所有网页,但它不会让我发布两个以上的链接,因为我是新手。

回答

1

如果您需要处理内存中的图像,请创建一个BufferedImage,然后调用BufferedImage.createGraphics()以访问用于绘制到图像缓冲区中的图形对象。

当您想要将该图像渲染到UI中的某个组件上时,请像完成一样使用该组件的paintComponent()方法。请注意,这涉及两个独立的图形对象,用于两个不同的目的。

+0

因此,我试图通过编写[this](http://pastebin.com/LutTz0p4)来做你所说的,但是,我没有得到要显示的图像,只是一个空白的应用程序。 – Nathan

+0

小心不要混淆图像和缓冲区。在paintComponent()中,使用g.drawImage(),而不是g2d.drawImage()。也是主方法的最后一行,您正在将图像绘制到属于同一图像的缓冲区,这可能会导致问题。为渲染创建一个单独的图像缓冲区(不要使用与源图像相同的图像对象)。 – JimN

+0

好吧,所以我在paintComponent()中有g.drawImage(),但我仍然不确定如何绘制旋转的图像。在改变paintComponent()并删除我的main中的最后一行后,它只绘制常规图像而不是旋转图像。 – Nathan