【问题标题】:BufferedImage How do I stop all the images from having the color from the last one paintedBufferedImage 如何阻止所有图像的颜色从最后一个绘制
【发布时间】:2014-05-28 01:45:01
【问题描述】:

我正在使用 Java,并且正在从 ppm 文件中读取,代码为 P3。

P3
# The P3 means colors are in ASCII, then 3 columns and 2 rows,
# then 255 for max color, then RGB triplets
3 2
255
255   0   0     0 255   0     0   0 255
255 255   0   255 255 255     0   0   0  

我使用此文件的目标是使用上述 rgb 值绘制 6 张图像,但是所有图像始终保持与最后一个 rgb 值相同的颜色。这是我的代码:

public class Window2 extends JFrame {

    public JMenuBar menubar;
    public JMenuItem importFile;
    public Scanner filePath;
    StringTokenizer tokens = null;
    ArrayList<BufferedImage> image = new ArrayList<>();
    int[][][] images;
    JPanel panelDown = new JPanel();
    MyPanel myPanel;
    Color myColor;

    int[] coords = new int[2];
    int i = 0, j = 0;

    public class MyPanel extends JPanel {

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            for (BufferedImage image1 : image) {
                g.drawImage(image1, 0, 0, null);
            }

        }
    }

    public Window2() {
        super("Exercise 2");
        menubar = new JMenuBar();
        setLayout(new BorderLayout());
        JPanel panelBar = new JPanel();
        add(panelBar, BorderLayout.NORTH);
        add(panelDown, BorderLayout.CENTER);
        importFile = new JMenuItem("Import", 'I');
        panelBar.add(menubar);
        menubar.add(importFile);
        importFile.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                FileDialog fd = new FileDialog(Window2.this, "Import Maze", FileDialog.LOAD);
                fd.setFile(".txt");
                fd.setLocation(Window2.this.getX() + 100, Window2.this.getY() + 100);
                fd.show();
                if (!fd.getFile().endsWith(".txt")) {
                    JOptionPane.showMessageDialog(Window2.this, "Wrong file extension", "Error", JOptionPane.WARNING_MESSAGE);
                } else {
                    File theFile = new File(fd.getDirectory() + "\\" + fd.getFile());
                    try {
                        filePath = new Scanner(theFile);
                    } catch (FileNotFoundException ex) {
                        Logger.getLogger(Window2.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    images = readFile(filePath);
                    panelDown.setLayout(new GridLayout(coords[0], coords[1]));
                    int z=0;
                    for (int k = 0; k < coords[0]; k++) {
                        for (int l = 0; l < coords[1]; l++) {
                            int red = images[k][l][0];
                            int green = images[k][l][1];
                            int blue = images[k][l][2];
                            myPanel = new MyPanel();
                            panelDown.add(myPanel);
                            image.add(new BufferedImage(30, 30, BufferedImage.TYPE_INT_ARGB));
                            myColor = new Color(red,green,blue,255);
                            for (int i = 0; i < 30; i++) {
                                for (int j = 0; j < 30; j++) {
                                    image.get(z).setRGB(i, j, myColor.getRGB());  
                                }
                            }
                            z++;
                        }
                    }
                    myPanel.repaint();
                }
            }
        });

        setSize(500, 500);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

这里缺少一种方法,它是 readFile。它分别返回一个数组[][][]、行数、列数和 rgb 值。关于如何解决此问题的任何想法?

【问题讨论】:

  • 而且每张图片的颜色值都是你所期待的?
  • 另外,图像在您的 paintComponent 方法中相互叠加...
  • 图像应该是红色、绿色、蓝色、黄色、白色、黑色,但所有六个图像都显示为黑色。如果它们相互重叠,我怎么能看到 6 个不同的图像?
  • 您看到相同的图像 6 次,因为您的 paintComponent 方法在 MyPanel 的每个实例的上下文中的同一位置绘制所有图像。尝试仅绘制 1,可能通过将 z 传递给 MyPanel 以便它知道要绘制哪个图像...

标签: java bufferedimage paintcomponent ppm


【解决方案1】:

MyPanel 每次绘制时都会绘制所有图像,因此MyPanel 的每个实例都显示添加到images List 的最后一张图像...

public class MyPanel extends JPanel {

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        for (BufferedImage image1 : image) {
            g.drawImage(image1, 0, 0, null);
        }

    }
}

然后为每个图像创建并添加MyPanel 的实例...

myPanel = new MyPanel();
panelDown.add(myPanel);

但是,MyPanel 将所有图像叠加在一起,因此仅显示添加到List 的最后一张图像...

请尝试将要绘制的单个图像传递给MyPanel

public class MyPanel extends JPanel {

    private BufferdImage img;

    public MyPanel(BufferdImage img) {
        this.img = img;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.drawImage(img, 0, 0, this);
    }
}

然后,当您构建映像时,传递对 MyPanel 实例的引用,例如。

for (int k = 0; k < coords[0]; k++) {
    for (int l = 0; l < coords[1]; l++) {
        //...
        BufferedImage img = new BufferedImage(30, 30, BufferedImage.TYPE_INT_ARGB);
        image.add(img);
        myColor = new Color(red,green,blue,255);
        for (int i = 0; i < 30; i++) {
            for (int j = 0; j < 30; j++) {
                image.get(z).setRGB(i, j, myColor.getRGB());  
            }
        }
        myPanel = new MyPanel(img);
        panelDown.add(myPanel);
        z++;
    }
}

【讨论】:

  • 该死,我永远不会记得在 MyPanel 中使用构造函数 --' 看起来我还有很长的路要走。非常感谢:D
  • 我也不得不拍几遍才能看到它;)很高兴它有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多