Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24
  1. #1

    Conoscere il colore di un dato pixel?

    Salve. E' possibile, dato un JPanel grafico (con paintComponent), sapere di che colore sia un determinato pixel? Se sì, come?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Conoscere il colore di un dato pixel?

    Originariamente inviato da Dreamer89
    Salve. E' possibile, dato un JPanel grafico (con paintComponent), sapere di che colore sia un determinato pixel? Se sì, come?
    Direttamente dal componente (o dal Graphics) non puoi ... non mi risulta. Potresti indirettamente sfruttando la classe Robot. Se hai le coordinate di un punto nel componente, relative al suo origin, puoi sicuramente ottenere le coordinate assolute nello schermo. E a quel punto potresti usare Robot.

    Ma non mi sembra una soluzione "pulita". Secondo me fai prima a spiegare cosa devi fare di preciso e il perché di una tale necessità.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Vorrei ricreare il gioco di Pacman, e quindi sto cercando un sistema che mi consente di far fermare la pallina se incontra dei muri. Se il prossimo pixel su cui si sta muovendo la pallina, ha colore diverso dallo sfondo, vuol dire che c'è un muro e quindi stoppo l'avanzamento. Se potessi utilizzare quel sistema sarebbe tutto molto semplice, altrimenti sono costretto a salvarmi dei valori booleani in una matrice che indicano dove ci sono muri e dove no... ma questo richiederebbe troppo tempo. Ora do un'occhiata alla classe Robot

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Dreamer89
    Vorrei ricreare il gioco di Pacman, e quindi sto cercando un sistema che mi consente di far fermare la pallina se incontra dei muri. Se il prossimo pixel su cui si sta muovendo la pallina, ha colore diverso dallo sfondo, vuol dire che c'è un muro e quindi stoppo l'avanzamento.
    Personalmente non mi sembra una buona soluzione. Perlomeno non andando a vedere i pixel tramite Robot.

    Però concettualmente potrebbe andare bene se ad esempio tu avessi fatto una immagine unica che rappresenta tutto il "campo" di gioco. In quel caso, avendo una immagine, andare a leggere un pixel è sicuramente più semplice e più "pulito".
    Si potrebbe anche pensare di realizzare una immagine apposita con 2 soli colori (es. bianco/nero) che traccia le sole parti dove ci si può muovere. Così non avrebbe importanza come fai i bordi con che colori, forma ecc...

    Originariamente inviato da Dreamer89
    Se potessi utilizzare quel sistema sarebbe tutto molto semplice, altrimenti sono costretto a salvarmi dei valori booleani in una matrice che indicano dove ci sono muri e dove no... ma questo richiederebbe troppo tempo.
    La soluzione migliore sarebbe proprio di quella di avere in memoria un "modello" che rappresenta il layout di gioco. Possibilmente gestito nel modo più efficiente e compatto possibile. Tu dici dei boolean ma ... la dimensione di un boolean dipende dalla JVM. Meglio sarebbe una matrice di bit gestita attraverso dei tipi 'int'.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Ho provato la classe Robot in questo modo, ma quando lancio il programma, viene lanciata una NullPointerException... presumo che color sia null... ma allora perchè è sbagliato?

    codice:
    import java.awt.Robot;
    import java.awt.Graphics;
    import java.awt.Color;
    import javax.swing.JPanel;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    
    public class TestRobot extends JPanel
    {
    	private static Color color;
    	private Robot robot;
    
    	public void paintComponent (Graphics g)
    	{
    		super.paintComponent (g);
    		
    		try
    		{
    			robot = new Robot();
    		}
    		catch (Exception e)
    		{
    			System.exit (1);
    		}
    		
    		color = robot.getPixelColor (50, 50);
    	}
    	
    	public static void main (String[] args)
    	{
    		TestRobot panel = new TestRobot();
    		
    		JFrame frame = new JFrame ("Test Robot");
    		frame.setSize (640, 480);
    		frame.setLocationRelativeTo (null);
    		frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    		
    		frame.add (panel);
    		
    		frame.setVisible (true);
    		JOptionPane.showMessageDialog (null, color.toString());
    	}
    }

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Dreamer89
    Ho provato la classe Robot in questo modo, ma quando lancio il programma, viene lanciata una NullPointerException... presumo che color sia null... ma allora perchè è sbagliato?
    Per questioni di tempistiche e comunque non sarebbe nemmeno il modo appropriato dal punto di vista del threading.

    Il fatto che hai messo il setVisible(true) prima di usare 'color' non vuol affatto dire che è certo che il paintComponent() sia già stato invocato!!

    Insomma, è sbagliato l'uso di un campo static, è sbagliato il fatto che la impostazione di color avviene nel contesto del EDT (event dispatch thread) mentre l'uso è nel "main" thread (e non c'è alcuna sincronizzazione) e non è appropriato un System.exit() in un metodo come paintComponent.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Originariamente inviato da andbin
    Per questioni di tempistiche e comunque non sarebbe nemmeno il modo appropriato dal punto di vista del threading.

    Il fatto che hai messo il setVisible(true) prima di usare 'color' non vuol affatto dire che è certo che il paintComponent() sia già stato invocato!!

    Insomma, è sbagliato l'uso di un campo static, è sbagliato il fatto che la impostazione di color avviene nel contesto del EDT (event dispatch thread) mentre l'uso è nel "main" thread (e non c'è alcuna sincronizzazione) e non è appropriato un System.exit() in un metodo come paintComponent.
    Non credo di aver capito bene... cosa dovrei modificare? :master:

  8. #8
    Sono riuscito ad impostare bene il programma, ma il colore che mi ritorna, è diverso da quello che dovrebbe essere, e non riesco a capire il motivo... o_O

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Dreamer89
    il colore che mi ritorna, è diverso da quello che dovrebbe essere, e non riesco a capire il motivo... o_O
    Giusto per chiarire: quelle che passi a getPixelColor sono coordinate sullo schermo, non relative al tuo componente o alla finestra che lo contiene. Se passi 50,50, esso è il pixel che sta all'offset 50,50 dall'angolo in alto a sinistra dello schermo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Originariamente inviato da andbin
    Giusto per chiarire: quelle che passi a getPixelColor sono coordinate sullo schermo, non relative al tuo componente o alla finestra che lo contiene. Se passi 50,50, esso è il pixel che sta all'offset 50,50 dall'angolo in alto a sinistra dello schermo.

    Grazie mille, ecco perchè i colori non coincidevano! Ma in che modo posso orientarmi bene sulla finestra del mio programma?

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.