我如何逐个像素地绘制图像到jframe

时间:2016-06-02 03:46:38

标签: java swing animation for-loop pixel

我是java的初学者,直到今天我试着做我认为自己的事。所以这一天就在这里;

我将图像的所有像素都作为rgb排列。我想点击一个按钮,然后逐个像素地创建类似动画的图像。

这就是我所做的不起作用;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;

public class pixell extends JFrame {
    int x = 0;
    int y = 0;
    JButton btn;
    JButton btn2;
    JButton btn3;
    JLabel lbl1;

    File file = new File("C:\\Users\\Gok\\Desktop\\df.jpg");
    BufferedImage image = ImageIO.read(file);

    int w = image.getWidth();
    int h = image.getHeight();
    int[][] rp = new int[w][(h)];
    BufferedImage rsm = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
    JLabel background;
    ImageIcon img = new ImageIcon(rsm);
    JPanel jp;

    public pixell() throws IOException {

        // TODO Auto-generated constructor stub

        this.setSize(612, 612);
        this.setLayout(null);
        btn = new JButton("al");
        btn2 = new JButton("yaz");

        btn.setBounds(100, 100, 100, 100);
        btn2.setBounds(100, 200, 100, 100);
        background = new JLabel(img);
        background.setBounds(10, 10, w, h);

        this.add(btn);
        this.add(btn2);

        this.add(background);

        btn.addMouseListener(new MouseAdapter() {

            @Override
            public void mousePressed(MouseEvent e) {

                for (int i = 0; i < w; i++) {

                    for (int j = 0; j < h; j++) {

                        // Getting pixel color by position x and y
                        int clr = image.getRGB(i, j);

                        int red = (clr & 0x00ff0000) >> 16;
                        int green = (clr & 0x0000ff00) >> 8;
                        int blue = clr & 0x000000ff;

                        rp[i][j] = clr;

                    }
                }


            }
        });

        btn2.addMouseListener(new MouseAdapter() {

            public void mousePressed(MouseEvent e) {

                for (int i = 0; i < w; i++) {


                    for (int j = 0; j < h; j++) {

                        rsm.setRGB(i, j, rp[i][j]);

                        jp.setVisible(false);
                        jp.revalidate();
                        jp.repaint();

                        jp.setVisible(true);
                        jp.revalidate();
                        jp.repaint();

                    }

                }
            }

        });



    }
}

1 个答案:

答案 0 :(得分:0)

  

如何逐像素地将图像绘制到jframe

不需要阵列。

BufferedImagegetRGB(...)setRGB(...)方法。所以你可以创建两个BufferedImages。一个将包含完整图像,另一个将包含用作ImageIcon的{​​{1}}的空BufferedImage。

然后你需要创建一个JLabel。每次Timer触发时,您都需要获取下一个像素并将其添加到空的BufferedImage。

在类的构造函数中,您可以使用以下代码创建Timer:

Swing Timer

变量&#34;计时器,行,列,originalBI,emptyBI,标签&#34;将是你班级中的所有实例变量。

现在,当您单击按钮时,只需调用timer = new Timer(20, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { emptyBI.setRGB(row, column, originalBI.getRGB(row, column); label.repaint(); column++; if (column >= originalBI.getWidth() { row++; column = 0; } if (row >= originalBI.getHeight() { Timer timer = (Timer)e.getSource(); timer.stop(); } } });

阅读How to Use Swing Timers上Swing教程中的部分,了解更多信息和示例。