Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    6

    [java]-immagine mappa-regioni irregolari

    CIAO,


    HO UN PICCOLO PROBLEMA CON LE SWING DI JAVA, DEVO CARICARE UNA IMMAGINE DI UNA MAPPA, LA MAPPA è DIVISA IN REGIONI, OGNI REGIONE HA DELLE FORME IRREGOLARI, TUTTE DIVERSE.


    LA MIA IDEA E' STATA QUELLA DI CREARE UNA CLASSE CHE ESTENDE UN JPANEL, IN QUESTA CLASSE IL METODO paintComponet(Graphics g) FA UN .drawImage SULL'IMMAGINE DELLA MAPPA, COSI MI DISEGNA LA MAPPA SUL JPANEL. ORA, PER IDENTIFICARE LE VARIE REGIONI L'IDEA E' QUELLA DI METTERE UN'ALTRA IMMAGINE IDENTICA CON LE REGIONI COLORATE IN MODO UNIFORME, COSì, QUANDO L'UTENTE CLICCA SULLA REGIONE PRENDO IL COLORE DELLA REGIONE CLICCATA PRENDENDO, OVVIAMENTE L'UTENTE DEVE VEDERE LA MAPPA
    NORMALE, NON QUELLA COLORATA. LA DOMANDA E':
    1) COME FACCIO A RENDERE INVISIBILE LA MAPPA CON LE REGIONI COLORATE?
    2) QUESTO E' IL METODO GIUSTO PER FARE UNA COSA DI QUESTO TIPO?
    3)COME FACCIO AD INSERIRE L'IMMAGINE SOTTO/SOPRA L'ALTRA? E POI COME FACCIO A PRENDERE L'EVENTO MOUSEcLICKET SULL'IMMAGINE, VISTO CHE IL MOUSEeVENT VA SOLO SUI COMPONENT E drawImage disegna direttamente delle immagini?


    Spero di essere stato chiaro, vi ringrazio

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da uzzo90 Visualizza il messaggio
    1) Come faccio a rendere invisibile la mappa con le regioni colorate?
    "Invisibile" nel senso che ..... non la devi proprio disegnare! Basta che tieni come variabile di istanza nel tuo pannello un BufferedImage (che tra l'altro ha getRGB, che ti servirà) e lo usi "programmaticamente" senza far vedere nulla di questa immagine.

    Quote Originariamente inviata da uzzo90 Visualizza il messaggio
    2) Questo e' il metodo giusto per fare una cosa di questo tipo?
    Se le aree sono estremamente irregolari/frastagliate, è una soluzione più che valida.
    A patto ovviamente di stabilire correttamente le associazioni tra colori e aree. Cioè è nel tuo codice che ci deve essere la conoscenza che un colore es. "rosso" (RGB 255,0,0) corrisponde all'area "A". Poi cosa sia (e cosa si debba fare con) l'area "A" è un altro discorso, ovviamente.

    Quote Originariamente inviata da uzzo90 Visualizza il messaggio
    3) Come faccio ad inserire l'immagine sotto/sopra l'altra? E poi come faccio a prendere l'evento mouseclicket sull'immagine, visto che il mouseevent va solo sui component E drawImage disegna direttamente delle immagini?
    Non è questione di "sopra/sotto". Se tu disegni la immagine per l'utente alle coordinate es. 20,20 del pannello e l'utente clicca alle coordinate es. 35,25 (sempre riferite all'origine del pannello), allora vuol dire che dovrai andare a vedere il pixel alle coordinate 15,5 nella immagine "nascosta" che usi programmaticamente per sapere quale colore è e quindi quale area.
    Tutto qui. Si tratta solo di sapere/stabilire a quali coordinate nel pannello disegni la immagine, in modo da poter calcolare le coordinate (che partono sempre da 0,0) nella immagine nascosta con la mappa dei colori.


    P.S. consiglio sull'uso del forum: non scrivere mai tutto in maiuscolo!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    6
    quindi dici di fare il drawImage sull'imagine originale e, invece su quella con le regioni colorate non fare niente, cioè avere solo l'istanza del BufferedImage nella mia classe che estende il Jpanel ed implementarla con un Listener e le coordinate del click fatto sull'immagine originale le vado ad associare alle coordinate dell'immagine modificata, giusto?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da uzzo90 Visualizza il messaggio
    quindi dici di fare il drawImage sull'imagine originale e, invece su quella con le regioni colorate non fare niente, cioè avere solo l'istanza del BufferedImage nella mia classe che estende il Jpanel ed implementarla con un Listener e le coordinate del click fatto sull'immagine originale le vado ad associare alle coordinate dell'immagine modificata, giusto?
    Sì, è concettualmente quello che ho detto. Se hai dubbi più precisi e tecnici, chiedi pure.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    6
    ti posto un po di codice esempio per chiarirmi alcuni dubbi :
    codice:
    public class MapGui extends JPanel implements ActionListener {
    
    public MapGui(){
            try {
            img  = javax.imageio.ImageIO.read(new java.io.File("C:\\Users....\\sfondo.jpg))
            image =ImageIO.read(new File("C:\\Users\\......\\Game_Board_big2.jpg"));
                
                } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }
    
    
    @Override     public void paintComponent(Graphics g) {
             super.paintComponent(g);
              g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
    }}
    
    
    public class Click implements MouseListener {
    public void mouseClicked(MouseEvent arg0) {
    Color c = new Color(img.getRGB(arg0.getX(), arg0.getY()), true);
    
    
    }}}

    ora, il mio dubbio è, visto che prendo il getRGB dall'immagine di sfondo, e il click è stato fatto sul panel rispetto all'immagine Game_Board se ingrandisco il Jpanel ovviamente le coordinate non combaciano più rispetto all'immagine di sfondo.

    Grazie veramente tanto per la disponibilità, gentilissimo.

    PS: ovviamente questo JPanel lo sto attaccando ad un JFrame
    Ultima modifica di uzzo90; 06-06-2014 a 18:56

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da uzzo90 Visualizza il messaggio
    ora, il mio dubbio è, visto che prendo il getRGB dall'immagine di sfondo, e il click è stato fatto sul panel rispetto all'immagine Game_Board se ingrandisco il Jpanel ovviamente le coordinate non combaciano più rispetto all'immagine di sfondo.
    La questione principale è che hai usato il drawImage con width/height e praticamente hai "spalmato" la immagine su tutta la superficie del pannello. Già questo di per sé è in grado di far perdere l'aspect-ratio originale della immagine. Se poi il tuo pannello è disposto in modo tale che la sua dimensione è in proporzione del frame e il frame è ridimensionabile allora .... hai pure la conseguenza che la dimensione/aspect-ratio della immagine è controllata dall'utente!

    Ovviamente così, senza fare nulla di particolare, le coordinate non sono più 1:1 con la immagine nascosta delle aree colorate! Ma se ci pensi, con un pochino di calcoli sarebbe anche possibile tornare ad avere coordinate più o meno corrispondenti con la immagine nascosta. Ma questi calcoli possono portare ad avere valori frazionari e quindi potenziali imprecisioni (tutte da considerare e valutare) specialmente lungo i bordi delle aree.

    Il punto quindi è: vuoi davvero che sia così? Non è obbligatorio, cioè non è che devi per forza rendere "estensibile" la immagine. Se vuoi continuare su questa strada ok ma .... così si va incontro a un po' di complicazioni. Quindi innanzitutto valuta bene questo aspetto.


    P.S. aggiungo: mettere path "assoluti" nei sorgenti generalmente non è una buona cosa. Se è solo temporaneamente per fare qualche prova al volo o per fare "veloce", beh, ok.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    6
    Si, hai decisamente ragione, la mia immagine si spalma su tutto il pannello. Ho fatto cosi per non avere problemi quando viene ingrandito il jFrame. Perchè sinceramente non sono riuscito a trovare una cavolo si funzione che all'ingrandimento del Jframe mantiene le proporzioni delle distanze tra i vari oggetti, tu ne sai qualcosa? grazie. Adesso provo a fare un drawImage senza width/height. vediamo se funziona. Comunque si, so che non devo usare path assoluti, l'ho fatto solo per questioni di comodità, a progetto finito metterò le immagini in una cartella del progetto. grazie comunque

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    6
    Ho provato a rimuovere width/height ed effettivamente funziona e funziona anche alla grande. Ma non esiste un metodo per avere due Livelli uno sull'altro, non so tipo i JLayerPane , perchè effettivamente a me serve che l'immagine in quel pannello si ridimensioni in base alla grandezza del JFrame...

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da uzzo90 Visualizza il messaggio
    Ma non esiste un metodo per avere due Livelli uno sull'altro, non so tipo i JLayerPane , perchè effettivamente a me serve che l'immagine in quel pannello si ridimensioni in base alla grandezza del JFrame...
    Non centrano niente i "livelli" (e nemmeno JLayeredPane). Se la immagine visibile all'utente la vuoi rendere ridimensionabile (dipendente dal frame e quindi dall'utente, potenzialmente perdendo anche il aspect-ratio originale) vai incontro solo a complicazioni. Che onestamente non so se valga la pena .... devi valutare tu.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    6
    Problema risolto. Posto la soluzione, magari può essere utile a qualcun altro:

    codice:
    public void paintComponent(Graphics g) {
    super.paintComponent(g);
    ret = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
    ret.createGraphics().drawImage(img,0,0,getWidth(),getHeight(),this);/* drawImage della imagine con le regioni colorate*/
    g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
    }
    allorora: ret è una variablie globale di tipo BufferedImage. il getRGB lo prendo proprio da ret. Spero sia chiara. A Presto e grazie

Tag per questa discussione

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.