java - 如何在java中构建缓冲区来合并图像

标签 java user-interface

那里。我正在使用 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*/);
    }
 }

正如我们所看到的,绘制需要时间,因此我想为某些构建一个缓冲区。它应该是一个图像或图形对象。
但后来我发现我无法采取任何方法来合并图像(只需将它们一个放在另一个上)。
所以我的问题是:如何构建如上所述的缓冲区,或者如果我使用 paintImage() 来绘制替代的Graphics , 如何使用此图形来绘制我的窗口
感谢大家。

最佳答案

这是合并图像数组的一种方法。

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);
    }
 }

关于java - 如何在java中构建缓冲区来合并图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12353271/

相关文章:

java - 注入(inject)点处带有限定符 @default 的类型不满足依赖关系

java - 为什么我们可以通过字面量来初始化String、Integer?

java - Java:升级到单个窗口

python - 如何在 Python 中创建基于单击 RadioButton 的循环

java - 如何打开新窗口

java - 如果绘制 JOptionPane,则不会绘制我的面板的组件

java - 用于编译 GUI 表单的 Ant 任务(Intellij IDEA)

java - Eclipse IDE 范围突出显示?

java - Libgdx Actor.setBounds() 相对于 Actor.x 和 Actor.y 等

java - 为单独的类文件编写方法