Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    81

    Chiarimento su createScreenCapture

    Tramite questo codice, ottengo uno screenshot:

    codice:
    static public BufferedImage shoot() throws AWTException, IOException {
    	Robot robot = new Robot();
            Rectangle r = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
            BufferedImage image = robot.createScreenCapture(r);
            return image;	}
    domande:
    1) come mai se creo diversi shot uno dopo l'altro, vengono tutti diversi tra loro? (parlo in termini di numero di byte poichè converto l'oggetto ottenuto in byte)
    2) potrebbe essere un problema della velocità con cui eseguo la chiamata questo motodo? (consideriamo che faccio il test senza "addormentare" il thread, quindi mettiamo che sia un ciclo for) o una caratteristica di createScreenCapture()?

    grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    81
    nessuno ha avuto qualche esperienza con questo metodo?
    Ho fatto una comparazione di questo tipo:

    - Ho creato 2 shot su 2 buffered image.
    - Ho convertito le bufferedimage in array d byte
    - ho fatto il confronto byte per byte

    A volte i byte sono identici tra le 2 immagini altre no...

    Vorrei capire quali sono le motivazioni

    UPDATE:
    Salvando le 2 immagini su disco, nonostante i bytes diversi, sembra non abbiano differenze, almeno ad occhio

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Hai qualche cosa che si muove sul monitor? Qualche widget tipo orologi analogici, o altro? Anche le icone della tray-bar possono cambiare e quindi dare origine a byte differenti... insomma: ci sono tanti fattori che possono influenzare... puoi postare la parte di codice che richiama quel metodo, così capiamo quanto "ravvicinati" sono i due shots.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    81
    grazie lele,

    in realtà non ho nulla sul desktop che si muove se non magari l'icona della rete vicino all'orologio ma ho testato anche su W7 dove non c'era quella che cambiava.

    il codice è il seguente:

    codice:
    try {
    			
    			BufferedImage i1 = ScreenShoot.shoot();
    			BufferedImage i2 = ScreenShoot.shoot();
    			byte[] originalImg = Converter.ImageToByteArray( i1 );
    			byte[] SecondImg = Converter.ImageToByteArray( i2 );
    			int len = originalImg.length;
    			if (SecondImg.length > originalImg.length) len = SecondImg.length ;
    			
    			nota(originalImg.length);
    			nota(SecondImg.length);
    			
    			ScreenShoot.saveImg(i1, "src/jFollow/img/Ciao1.jpg");
    			ScreenShoot.saveImg(i1, "src/jFollow/img/Ciao2.jpg");
    			
    			
    			
    			for (int i = 0 ; i<len ; i++) {
    				nota(String.format("%10s %10s %10s %10s",i, originalImg[i], SecondImg[i], originalImg[i] - SecondImg[i] ));
    				//nota(String.format("%10s %10s", String.valueOf(SecondImg[i])));
    			}
    			
    			//nota(originalImg.length);
    			
    		} catch (AWTException e) {
    			e.printStackTrace();
    		}


    UPDATE:
    Dimenticavo, Converter è una classe con dei metodi statici che mi sono creato per le conversioni

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    81
    in relazione all'invio di dati per visualizzare il desktop in remoto, cosa mi dici se utilizzassi RMI?
    non lo conosco ancora ma mi ducumenterei.
    Ho pensato ad un semplice algoritmo per il confronto di due immeìagini ma ho bisogno di capire come mai gli screenshot sono sempre diversi.
    Altrimenti ho sempre delle immagini diverse

    grazie

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    147
    Calcola che il monitor ha una sua frequenza di aggiornamento che in genere è di 60 Hertz, quindi significa che ogni 16 ms circa i pixel dello schermo vengono rinfrescati... Ovviamente l'occhio umano non si accorge di niente, ma due screenshot in istanti diversi potrebbero lievemente differire, anche perché a seconda dei monitor potresti avere anche altri fenomeni, come sfarfallii, ecc... Puoi anche verificarlo indipendentemente da Java, con il tasto PrintScreen e Paint... Comunque al di là di ciò, se nel tuo desktop remoto vuoi giustamente mandare solo i cambiamenti, controllare "solo" la lunghezza in byte non mi sembra una soluzione molto robusta: paradossalmente potresti avere immagini completamente diverse con dimensioni simili... Senza scomodare algoritmi e librerie di image detection, potresti dare un'occhiata alle funzioni di BufferedImage, ad es. getRGB(), per fare dei controlli sui pixel omologhi in due immagini: se la differenza supera una certa soglia allora la mandi, altrimenti no.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    81
    grazie water l'idea non è quella di vedere la lunghezza di byte ma di creare un metodo che analizzi ricorsivamente le sezioni dell'immagine che differiscono...è un'idea che ancora non ho messo su e quindi non ho testato...dovrei mappare i pixel prima di ogni cosa e poi dividere l'immagine in tante sotto immagini...

    intanto mi interessava capire come mai gli screenshot era doversi ed è probabile che mi hai risposto...grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.