Salvaschermo java con immagini in movimento

di il
1 risposte

Salvaschermo java con immagini in movimento

VOLEVO OTTENERE DELLE IMMAGINI IN MOVIMENTO SOPRA L'IMMAGINE DELLO SCHERMO (DESKTOP).
NON VOLEVO PERÒ SALVARE IL FILE DELL'IMMAGINE CATTURATA IN MEMORIA MA TENERLO SOLO TEMPORANEAMENTE. NEL SEGUENTE LISTATO (SALVASCHERMO 4)VIENE DISEGNATA PENSO LA PRIMA IMMAGINE SOPRA QUELLA DELLO SCHERMO CHE È STATA CATTURATA MA NON C'È NESSUN MOVIMENTO.

IN UN LISTATO PRECEDENTE (SALVASCHERMO 1) SI OTTENEVA IL MOVIMENTO MA NON ERO RIUSCITO A EVITARE DI SALVARE IL FILE NELLA MEMORIA DEL COMPUTER. COME SI POTREBBE FARE?

SALVASCHERMO 4

import java.awt.*;
import java.awt.event.*;
import java.awt.AWTException;
import java.awt.Color;
import java.awt.MediaTracker;
import java.awt.Robot;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import java.io.*;

public class MyPanel {
public static void main(String[] args) throws AWTException, IOException {
Image screencapture=new Robot().createScreenCapture(
new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) );
ImagePanel panel = new ImagePanel(screencapture);
JFrame frame = new JFrame();
frame.getContentPane().add(panel);
frame.pack();
frame.setVisible(true);
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
}
});
} catch(Exception e) {}
}
public class AnimationExample extends JFrame {
private MyPanel panel;
AnimationExample() {
panel = new MyPanel();

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
}

class ImagePanel extends JPanel {
Dichiarazione variabili...
...
private Image img;

public ImagePanel(String img) {
this(new ImageIcon(img).getImage());
}

public ImagePanel(Image img) {
this.img = img;
Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
setPreferredSize(size);
setMinimumSize(size);
setMaximumSize(size);
setSize(size);
setLayout(null);

Calcolo variabili per il disegno …
...
repaint();
}

public void paintComponent(Graphics g) {
setOpaque(false);
g.drawImage(img, 0, 0, null);
try {
MediaTracker track = new MediaTracker(this);
track.addImage(img, 0);
track.waitForID(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
Disegno sopra l'immagine dello schermo che ho catturato

uso
g.fillPolygon(.. .);
g.setColor(.. .);
g.drawLine(.. .);


}

SALVASCHERMO 1

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import java.awt.Graphics;
import java.awt.Image;

class MyPanel extends JPanel implements ActionListener {
private Timer timer;

Dichiarazione variabili ...

MyPanel() {
try {
} catch(Exception e) {}
inizializzazione variabili...

timer = new Timer(PAUSE, this);
timer.start();
}

public void actionPerformed(ActionEvent ae) {
Calcolo le variabili per il movimento ...

}
repaint();
}
public void paintComponent(Graphics g) {
setOpaque(false);
Image img = Toolkit.getDefaultToolkit().createImage("/home/paolo/Scrivania/screencapture.jpg");
try {
MediaTracker track = new MediaTracker(this);
track.addImage(img, 0);
track.waitForID(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
g.drawImage(img, 0, 0, null);
Disegno ...
}


class AnimationExample extends JFrame {
private MyPanel panel;

AnimationExample() {
super("Esempio Animazione");

panel = new MyPanel();
add(panel);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void makeGUI() {
AnimationExample ae = new AnimationExample();
ae.setSize(1440, 900);
ae.setVisible(true);
}

public static void main(String[] args) throws AWTException, IOException {
// capture the whole screen
BufferedImage screencapture = new Robot().createScreenCapture(
new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) );

// Save as JPEG
File file = new File("/home/paolo/Scrivania/screencapture.jpg");
ImageIO.write(screencapture, "jpg", file);
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
Image img = Toolkit.getDefaultToolkit().createImage("/home/paolo/Scrivania/screencapture.jpg");
makeGUI();
}
});
} catch(Exception e) {}
}
}

1 Risposte

  • Re: Salvaschermo java con immagini in movimento

    ppinna ha scritto:


    VOLEVO OTTENERE DELLE IMMAGINI IN MOVIMENTO SOPRA L'IMMAGINE DELLO SCHERMO (DESKTOP).
    NON VOLEVO PERÒ SALVARE IL FILE DELL'IMMAGINE CATTURATA IN MEMORIA MA TENERLO SOLO TEMPORANEAMENTE. NEL SEGUENTE LISTATO (SALVASCHERMO 4)VIENE DISEGNATA PENSO LA PRIMA IMMAGINE SOPRA QUELLA DELLO SCHERMO CHE È STATA CATTURATA MA NON C'È NESSUN MOVIMENTO.

    IN UN LISTATO PRECEDENTE (SALVASCHERMO 1) SI OTTENEVA IL MOVIMENTO MA NON ERO RIUSCITO A EVITARE DI SALVARE IL FILE NELLA MEMORIA DEL COMPUTER. COME SI POTREBBE FARE?
    Innanzitutto non scrivere tutto in maiuscolo ... non è buona cosa su forum/newsgroup.

    Seconda cosa: il tuo codice è parecchio "confuso" (complice anche il fatto che è parziale con omissioni di varie parti).

    Terza cosa, assolutamente lampante che ho notato subito: in un paintComponent NON fare caricamenti di immagini, tracking (MediaTracker) o cose del genere. Un paintComponent deve fare una sola cosa: disegnare. E possibilmente il minimo indispensabile e il più velocemente possibile.
    Nemmeno setOpaque(false), che va fatto una tantum (tipicamente nel costruttore)

    Quarta cosa, che è poi quello che chiedi all'inizio: il Robot ti fornisce un BufferedImage che è già completo, senza alcun bisogno di "tracking". Non c'è affatto bisogno di salvare la immagine e poi rileggerla. Usa (e disegna) direttamente questo BufferedImage, chiaramente devi passarlo dove/come necessario.
Devi accedere o registrarti per scrivere nel forum
1 risposte