我是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();
}
}
}
});
}
}
答案 0 :(得分:0)
如何逐像素地将图像绘制到jframe
不需要阵列。
BufferedImage
有getRGB(...)
和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教程中的部分,了解更多信息和示例。