2012-09-10 30 views
0

那里。我使用Java来构建需要经常重绘的桌面程序。就像下面:如何构建缓冲区来合并java中的图像

class myWindow extends JWindow { 
    Image[] layers = new Image[8] // Some png Image object filled here 

    @Override 
    public void paint(Graphics g) { 
     int i; 

     super.paint(); 
     for (i=0;i<=7;i++) 
      g.paintImage(layers[i], /*other param*/); 
    } 
} 

我们可以看到,它的成本的时间作画,所以我想建立一些layer的缓冲区。它应该是一个图像或图形对象。
但后来我发现我可以采取任何方法合并Image(只要把他们一个在另一个)。
所以我的问题是:如何建立一个缓冲区正如我上面提到的,或者如果我使用paintImage()画上一个替代Graphics我如何使用这个Graphics画出我的窗口
感谢所有。

回答

2

下面是合并Image数组的一种方法。

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.image.BufferedImage; 

import javax.swing.JPanel; 

class MyPanel extends JPanel { 

    BufferedImage image; 

    public MyPanel(Image[] layers) { 
     this.image = createBufferedImage(layers); 
    } 

    protected BufferedImage createBufferedImage(Image[] layers) { 
     Dimension maxSize = new Dimension(); 
     for (int i = 0; i < layers.length; i++) { 
      Dimension d = new Dimension(layers[i].getWidth(this), 
        layers[i].getHeight(this)); 
      maxSize = max(maxSize, d); 
     } 
     image = new BufferedImage(maxSize.width, maxSize.height, 
       BufferedImage.TYPE_INT_ARGB); 
     Graphics g = image.getGraphics(); 
     g.setColor(Color.WHITE); 
     g.fillRect(0, 0, image.getWidth(), image.getHeight()); 

     for (int i = 0; i < layers.length; i++) { 
      g.drawImage(layers[i], 0, 0, this); 
     } 
     g.dispose(); 
     return image; 
    } 

    protected Dimension max(Dimension a, Dimension b) { 
     Dimension d = new Dimension(); 
     d.width = Math.max(a.width, b.width); 
     d.height = Math.max(a.height, b.height); 
     return d; 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(image, 0, 0, this); 
    } 
} 
+0

我有一个关于此应用程序的旧版本,但它使用单层。您可以[从我的skydrive下载](https://skydrive.live.com/redir?resid=AD741B27120B92FD!217&authkey=!AEbJHeMZWW37SK8)。我已经将它构建到'。\ debug \'中,只需运行CyauShell.class即可。谢谢你的帮助。 – cuter44

+0

如果我将'paintComponent()'改成'paint()',它会起作用吗?这就是我以前做的事情。 – cuter44

+0

查看我的更新回答。 –

相关问题