Загрузка изображения построчно Java
Так что это будет звучать смешно, но я работаю над проектом, в котором я намеренно хочу замедлить загрузку изображения так, чтобы оно загружалось построчно. Могу ли я это сделать? В настоящее время у меня есть изображение в ImagePane, которое является просто расширением JPanel:
public ImagePane() {
initComponents();
image = null;
//this.setAutoscrolls(true);
}
public void setImage(String path) throws IOException {
image = ImageIO.read(getClass().getResource(path));
}
@Override
public void paintComponent(Graphics g)
{
//Graphics2D g2 = (Grahpics2D)g;
g.drawImage(image, 0,0, this);
}
И в моем окне, что я пытаюсь отобразить это как:
ImagePane image = new ImagePane();
try {
image.setImage("netscapelogo2.png");
}
catch (IOException e) {
System.out.print("Failed to Set");
e.printStackTrace();
}
//jScrollPane1.add(image);
jScrollPane1.setViewportView(image);
Я полагаю, что мне нужно, чтобы кто-то изменил мой метод paintComponent, чтобы сделать это, но я не уверен, как именно это сделать.
1 ответ
Это решение использует предпосылку I would simulate that the image is loading line by line by uncovering it gradually. – rodrigoap
Таким образом, изображение загружается сразу и отображается только так, как если бы оно было прочитано построчно!
решение было бы создать поток и позволить поток к работе...
Runnable r = new Runnable(){
@Override
run(){
for(int i = 0; i < image.getHeight(); i++){
// wait 100ms to 'slow down'
Thread.sleep(100)// surround with try/catch, it may throw an exception
line = line + 1; //increase amount of visible lines
repaint(); //update the panel
}
}
}
//i don't know when you want to start the animation
new Thead(r).start(); //so trigger at free will
когда вы рисуете изображение, вы просто рисуете количество линий, а не все изображение вообще...
@Override
public void paintComponent(Graphics g)
{
super(g);
int w = image.getWidth();
int h = image.getHeight();
g.drawImage(image, 0,0, w, line, 0,0,w,h,this);
}
Метод drawImage немного странный, обратитесь к документу за дополнительной помощью.
конечно, вам нужно определить private int line = 0;
в каком-то месте