Torna indietro   Hardware Upgrade Forum > Software > Programmazione

NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica
Debuttano ufficialmente i primi sistemi notebook basati su piattaforma NVIDIA RTX Spark, abbinati a Windows on ARM e pensati per l'intelligenza artificiale agentica. Architettura integrata tra CPU e GPU che condividono la memoria di sistema, capace di gestire in locale modelli molto grandi ma al contempo anche di spiccare con la grafica e l'elaborazione
Motorola razr fold, dalla conchiglia al formato a libro. La recensione
Motorola razr fold, dalla conchiglia al formato a libro. La recensione
Abbiamo provato Motorola razr fold, il pieghevole a libro con display interno LTPO da 8,09 pollici, Snapdragon 8 Gen 5 e batteria da 6000 mAh in 243 grammi. Pennino e custodia sopno già nella confezione, per un foldable che si caratterizza per il pannello luminoso, l'autonomia ottima per la categoria e le fotocamere coerenti e ben sfruttabili. Il listino è di 1999 euro, ma in vendita si trova già a molto meno
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente
Google Pixel Watch 5 ha affinato una formula già convincente con hardware più veloce, Gemini offline e nuovi strumenti per sport e benessere. Abbiamo provato la versione LTE da 41 mm, comoda anche di notte e ben proporzionata sui polsi piccoli. Il design resta un punto di forza, ma l'autonomia premia ancora il 45 mm e alcune funzioni AI non sono disponibili in Italia: ecco che cosa cambia rispetto a Watch 4 e quale formato conviene scegliere oggi
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-04-2009, 18:24   #1
Genymus
Senior Member
 
L'Avatar di Genymus
 
Iscritto dal: Oct 2007
Messaggi: 364
[ Applet Java ] Scorrimento Immagini - Genymus

Salve, avrei bisogno di una applet java che faccia scorrere orrizzontalmente verso destra una serie di immagini in continuazione ripartendo dalla prima quando le ha visualizzate tutte.
Grazie

Genymus
__________________
Genymus!!!
"Che cosa vorreste far incidere sulla vostra tomba?". "Torno fra 5 minuti."
"Lucido" è quando credi soltanto a metà di ciò che ti dicono. "Brillante" è quando sai a quale metà credere.
"Pensa, ogni volta che respiro muore un uomo." "Hai provato a fare qualcosa per l'alito?"

Aforismieaforismi.it
Genymus è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 19:41   #2
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Si tratta semplicemente di usare un offset per spostare l'origine degli assi tra un'invocazione e l'altra di:

Codice:
for(int i = 0; i < maxFramesPerPage; i++) {
    g.drawImage(frames[i], offsetX, 0, null);
}
Qui maxFramesPerPage è calcolato come il numero massimo di immagini visualizzabili in un un'unica schermata più uno.

L'offset varia da 0 a -frames[0].getWidth() (supponendo che frames sia un array di BufferedImage).

Quando l'offset raggiunge -frames[0].getWidth() fai scorrere il vettore a sinistra e aggiungi tante immagini quante sono necessarie a riempire nuovamente lo schermo.

Nulla di particolarmente esotico.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 21:12   #3
Genymus
Senior Member
 
L'Avatar di Genymus
 
Iscritto dal: Oct 2007
Messaggi: 364
penso di aver capito...
può postarmi il codice completo?
__________________
Genymus!!!
"Che cosa vorreste far incidere sulla vostra tomba?". "Torno fra 5 minuti."
"Lucido" è quando credi soltanto a metà di ciò che ti dicono. "Brillante" è quando sai a quale metà credere.
"Pensa, ogni volta che respiro muore un uomo." "Hai provato a fare qualcosa per l'alito?"

Aforismieaforismi.it
Genymus è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 00:16   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Come no, eccolo qua.

Codice:
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
import javax.imageio.*;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import java.util.*;

public class SlideApplet extends JApplet {
	private final Screen SCREEN = new ScreenImpl();
	
	private void initializeUI() {
		add(SCREEN.getComponent());
		String speedValue = getParameter("speed");
		if(speedValue != null) {
			try {
				SCREEN.setSpeed(Float.parseFloat(speedValue));
			} catch(NumberFormatException ex) {
				System.err.println("speed property " + speedValue + " not a float. Using default.");
			}
		}
		try {
			URL list = new URL(getCodeBase() + "/" + getParameter("imagelist"));
			SCREEN.setImages(list);
			SCREEN.start();
			System.out.println("screen on line");
		} catch(MalformedURLException ex) {
			System.err.println("whops, wrong url!");
			ex.printStackTrace();
		}
	}
	
	public void init() {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				initializeUI();
			}
		});
	}
	
	public void stop() {
		SCREEN.stop();
	}
}

interface Screen {
	void setSpeed(float value);
	void setImages(URL pathListUrl);
	void start();
	void stop();
	JComponent getComponent();
}

class Ticker {
	private long then;
	private long tick;
	
	public void start() {
		then = System.nanoTime();
	}
	
	public void update() {
		long now = System.nanoTime();
		tick = (now - then) / 1000000;
		then = now;
	}
	
	public long getTick() {
		return tick;
	}
}

class ScreenImpl extends JPanel implements Screen {
	private final ActionListener LOOP = new ActionListener() {
		public void actionPerformed(ActionEvent e) { slide(); }
	};
	private final javax.swing.Timer ANIMATOR = new javax.swing.Timer(5, LOOP);
	private final CopyOnWriteArrayList<String> IMAGES = new CopyOnWriteArrayList<String>();
	private final ImageLoader IMAGE_LOADER = new ImageLoaderImpl();
	private final AtomicInteger OFFSET_X = new AtomicInteger();
	private final AtomicInteger NEXT_IMAGE = new AtomicInteger();
	private final AtomicBoolean WAITING_LOAD = new AtomicBoolean();
	private volatile float speed = 0.05f;
	
	/** edt fields */
	private final Ticker TICKER = new Ticker();
	private final LinkedList<BufferedImage> FRAMES = new LinkedList<BufferedImage>();
	
	public void setSpeed(float value) {
		if(value < 0.01f) {
			System.err.println(value + " too low");
		} else {
			speed = value;
		}
	}
	
	public void setImages(final URL pathListUrl) {
		if(pathListUrl == null) {
			System.err.println("ScreenImpl, method setImages, url is null");
			return;
		}
		
		Thread runner = new Thread() {
			public void run() {
				try {
					LinkedList<String> list = new LinkedList<String>();
					Scanner in = new Scanner(pathListUrl.openStream());
					while(in.hasNextLine()) {
						list.add(in.nextLine());
					}
					setImages(list);
				} catch(IOException ex) {
					return;
				}
			}
		};
		runner.setDaemon(true);
		runner.start();
	}
	
	public void setImages(Collection<String> paths) {
		stop();
		IMAGES.clear();
		IMAGES.addAll(paths);
		OFFSET_X.set(0);
		NEXT_IMAGE.set(0);
		start();
	}
	
	public JComponent getComponent() {
		return this;
	}
	
	private void slide() {
		TICKER.update();
		int paintSize = OFFSET_X.get() - getWidth();
		for(int i = 0; i < FRAMES.size(); i++) {
			paintSize += FRAMES.get(i).getWidth();
		}
		if(paintSize <= getWidth()) {
			loadNextFrame();
		} else {
			int delta = -(int)Math.round(speed * TICKER.getTick());
			if(OFFSET_X.addAndGet(delta) + FRAMES.get(0).getWidth() <= 0) {
				OFFSET_X.set(0);
				FRAMES.remove(0);
			}
			repaint();
		}
	}
	
	private void loadNextFrame() {
		if(IMAGES.size() == 0) {
			return;
		}
		if(WAITING_LOAD.get()) {
			return;
		}
		WAITING_LOAD.set(true);
		
		URL address = getClass().getResource(IMAGES.get(NEXT_IMAGE.get()));
		IMAGE_LOADER.submit(new LoadImage(address, getGraphicsConfiguration()) {
			public void run() {
				FRAMES.add(getImage());
				WAITING_LOAD.set(false);
			}
		});
		if(address != null) {
			if(NEXT_IMAGE.incrementAndGet() == IMAGES.size()) {
				NEXT_IMAGE.set(0);
			}
		}
	}

	protected void paintComponent(Graphics graphics) {
		super.paintComponent(graphics);
		Graphics2D g = (Graphics2D)graphics;
		graphics.translate(OFFSET_X.get(), 0);
		int x = 0;
		
		for(BufferedImage image : FRAMES) {
			int y = getHeight() / 2 - image.getHeight() / 2;
			graphics.drawImage(image, x, y, null);
			x += image.getWidth();
		}
	}
	
	public void start() {
		TICKER.start();
		ANIMATOR.start();
	}
	
	public void stop() {
		IMAGE_LOADER.stop();
		ANIMATOR.stop();
	}
}

abstract class LoadImage implements Runnable {
	private final URL ADDRESS;
	private final GraphicsConfiguration GC;
	private BufferedImage image;
	
	LoadImage(URL address, GraphicsConfiguration gc) {
		ADDRESS = address;
		GC = gc;
	}
	
	URL getAddress() {
		return ADDRESS;
	}
	
	GraphicsConfiguration getGC() {
		return GC;
	}
	
	synchronized void setImage(BufferedImage image) {
		this.image = image;
	}
	
	synchronized BufferedImage getImage() {
		return image;
	}
}

interface ImageLoader {
	void submit(LoadImage task);
	void stop();
}

class ImageLoaderImpl implements ImageLoader{
	private LinkedBlockingQueue<LoadImage> TASK_QUEUE = new LinkedBlockingQueue<LoadImage>();
	private final AtomicBoolean RUN = new AtomicBoolean(false);
	private Thread runner;
	
	private synchronized void setRunner(Thread t) {
		runner = t;
	}
	
	private synchronized Thread getRunner() {
		return runner;
	}
	
	public void stop() {
		Thread t = getRunner();
		if(t != null) {
			t.interrupt();
		}
		RUN.set(false);
	}
	
	public void submit(LoadImage task) {
		if(RUN.get() == false) {
			RUN.set(true);
			setRunner(new Thread() { public void run() { loop(); } });
			getRunner().start();
		}
		for(LoadImage i : TASK_QUEUE) {
			if(i.getAddress().equals(task.getAddress())) return;
		}
		TASK_QUEUE.offer(task);
	}
	
	private void loop() {
		while(RUN.get()) {
			try {
				execute(TASK_QUEUE.take());
			} catch(InterruptedException ex) {
				return;
			}
		}
	}
	
	private void execute(LoadImage task) {
		try {
			System.out.println("loading " + task.getAddress());
			BufferedImage image = ImageIO.read(task.getAddress());
			task.setImage(optImage(image, task.getGC()));
			EventQueue.invokeLater(task);
		} catch(IOException ex) {
			ex.printStackTrace();
		}
	}
	
	private BufferedImage optImage(BufferedImage source, GraphicsConfiguration gc) {
		if(gc == null) {
			return source;
		} else {
			BufferedImage opt = gc.createCompatibleImage(source.getWidth(), source.getHeight(),
				source.getTransparency());
			Graphics2D g = opt.createGraphics();
			g.drawImage(source, 0, 0, null);
			g.dispose();
			source.flush();
			return opt;
		}
	}
}
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 13:48   #5
Genymus
Senior Member
 
L'Avatar di Genymus
 
Iscritto dal: Oct 2007
Messaggi: 364
Salve, la compilazione funziona alla perfezione...
mi può dire anche il codice html per i parametri?
Grazie
__________________
Genymus!!!
"Che cosa vorreste far incidere sulla vostra tomba?". "Torno fra 5 minuti."
"Lucido" è quando credi soltanto a metà di ciò che ti dicono. "Brillante" è quando sai a quale metà credere.
"Pensa, ogni volta che respiro muore un uomo." "Hai provato a fare qualcosa per l'alito?"

Aforismieaforismi.it
Genymus è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 14:20   #6
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
l'applet richiede due parametri, uno è speed l'altro è imagelist.

Il valore di speed è numerico ed esprime la velocità dello scorrimento delle immagini in pixel al millisecondo.

Il valore di imagelist è il percorso relativo di un file di testo. Questo file di testo contiene un elenco di percorsi relativi di file immagini (png, jpg, gif, bmp per la piattaforma standard Java SE 5+). Ogni linea di testo nel file contiene un percorso di immagine. Ad esempio il file potrebbe essere:

Codice:
/immagini/thumb001.png
/immagini/thumb002.png
/immagini/thum003.png
/immagini/thum004.png
e così via fino a dove si vuole. Durante l'esecuzione il programma usa questi percorsi per caricare le immagini da visualizzare. Supponendo che il file si chiami list.txt si trovi nella stessa cartella dell'applet il codice dell'applet potrebbe essere:

Codice:
<applet code="SlideApplet.class" width="400" height="400">
<param name="speed" value="0.05">
<param name="magelist" value="/list.txt">
</applet>
Non ho testato l'applet in linea. Adesso come adesso mi viene in mente che potrebbe esserci un problema nel caricamento delle immagini per via del getClass().getResource(). Forse sarebbe meglio usare dei percorsi assoluti.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 14:43   #7
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Ho testato l'applet in linea, il caricamento delle immagini è ok ma c'è una valutazione ottimistica della banda in dowload del client (quantomeno della mia).

Il codice del metodo slide() al momento attende il caricamento dell'immagine necessaria ad assicurare il riempimento dello schermo prima di procedere con l'animazione il che causa interruzione dello scorrimento.

Sostituendo il metodo slide con questa versione:

Codice:
	private void slide() {
		TICKER.update();
		int paintSize = OFFSET_X.get() - getWidth();
		for(int i = 0; i < FRAMES.size(); i++) {
			paintSize += FRAMES.get(i).getWidth();
		}
		if(paintSize <= getWidth()) {
			loadNextFrame();
		}
		
		if(FRAMES.size() == 0) return;
		
		int delta = -(int)Math.round(speed * TICKER.getTick());
		if(OFFSET_X.addAndGet(delta) + FRAMES.get(0).getWidth() <= 0) {
			OFFSET_X.set(0);
			FRAMES.remove(0);
		}
		repaint();
	}
l'animazione prosegue se esiste almeno un'immagine nel buffer FRAMES. L'effetto cambia perchè adesso l'applet non è più in grado di garantire che l'utente veda effettivamente almeno un'immagine. E' possibile cioè che una banda particolarmente orrenda o immagini di dimensioni rilevanti causino lo svuotamento dell'applet.

Qui è roba da alchimisti. Non si può proiettare un'immagine che non c'è e non si può caricare l'immagine più rapidamente di quanto permetta la connessione del client.

Una soluzione potrebbe essere la ripetizione di un'immagine scelta a caso tra quelle tolte dal buffer ma ancora memorizzate.

La trama si complica .
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 14:44   #8
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Ps. Se vuoi provare qui trovi l'applet in funzione (le immagini le ho praticamente recuperate dal cestino, non farci caso).
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 20:53   #9
Genymus
Senior Member
 
L'Avatar di Genymus
 
Iscritto dal: Oct 2007
Messaggi: 364
Grazie
Funziona tutto alla perfezione.

Ps:Mi ha salvato la vita.

Genymus
__________________
Genymus!!!
"Che cosa vorreste far incidere sulla vostra tomba?". "Torno fra 5 minuti."
"Lucido" è quando credi soltanto a metà di ciò che ti dicono. "Brillante" è quando sai a quale metà credere.
"Pensa, ogni volta che respiro muore un uomo." "Hai provato a fare qualcosa per l'alito?"

Aforismieaforismi.it
Genymus è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica NVIDIA RTX Spark: il PC Windows on ARM costruito...
Motorola razr fold, dalla conchiglia al formato a libro. La recensione Motorola razr fold, dalla conchiglia al formato ...
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente Recensione Google Pixel Watch 5: sembra lo stess...
Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo Nokia Innovation Day 2026: la sovranità e...
In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi In sella alla Fiido Nomads Pro: e-bike con motor...
Non buttare il tuo vecchio smartphone: l...
GTA VI, manca sempre meno al lancio: Roc...
Honor prepara il suo primo pieghevole la...
Starshield torna operativo per le forze ...
La NASA porta le batterie allo stato sol...
Finto mining di criptovalute: 200 vittim...
AI sul PC senza passare dal cloud, come ...
ASUS aggiorna la sua gamma di monitor da...
Android potrà spegnere e riavviare il PC...
Quale capienza di micro SD è la p...
TSMC valuta il Texas per nuove fab, trat...
YouTube Music introduce nuove etichette ...
Questa foto non è intelligenza artificia...
AliExpress lancia Elite: sconti del 5% e...
007 First Light arriva su Nintendo Switc...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 19:14.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v