Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Ritagliare immagine

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2017
    Messaggi
    19

    Ritagliare immagine

    Ciao a tutti, ottengo una immagine dal database SQLite in formato blob. Sono facilmente in grado di visualizzarla in una Jlabel in questo modo:
    codice:
    ImageIcon imageIcon = new ImageIcon(new ImageIcon(book.icona_blob).getImage().getScaledInstance(50, 50, Image.SCALE_SMOOTH));
                lbIcon.setIcon(imageIcon);
    Ora, prima di visualizzarla nella label, vorrei rendere trasparente la parte esterna dell'immagine, quella di colore nero.
    Ho trovato diversi esempi, ma fin ora con nessuno di quelli sono riuscito ad eliminare la parte nera.
    Grazie per qualsiasi aiuto/consiglio.
    Immagini allegate Immagini allegate
    • Tipo di file: png 1.png‎ (19.5 KB, 11 visualizzazioni)

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Se tu avessi a che fare con una BufferedImage potresti andare direttamente a modificarne i pixel, anche con un semplice metodo che cerchi i pixel di colore nero e li sostituisca con un colore completamente trasparente.
    Sai che tipo di immagine ottieni da quel getImage ()? Puoi anche testarlo semplicemente stampando a video l'oggetto con:

    codice:
    System.out.println (new ImageIcon(book.icona_blob).getImage());

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2017
    Messaggi
    19
    questo è ciò che ottengo:
    codice:
    sun.awt.image.ToolkitImage@5becc41
    sun.awt.image.ToolkitImage@12bdf047
    sun.awt.image.ToolkitImage@510c80c6
    sun.awt.image.ToolkitImage@4fbd2a6b
    Non ho scritto che l'immagine non è sempre quella, quindi cercare i pixel neri è da escludere.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da chri.c Visualizza il messaggio
    Ora, prima di visualizzarla nella label, vorrei rendere trasparente la parte esterna dell'immagine, quella di colore nero.
    Se la immagine viene caricata dal Toolkit AWT (e con quel new ImageIcon(book.icona_blob) è così), la immagine è appunto del Toolkit, che ha una caratteristica importante: non è modificabile, in pratica read-only.

    Devi generare un BufferedImage e attenzione, se vuoi la trasparenza, che abbia il canale "alpha". A quel punto modifichi i pixel come vuoi.


    Quote Originariamente inviata da chri.c Visualizza il messaggio
    sun.awt.image.ToolkitImage@5becc41
    Questo denota appunto che l'Image proviene dal Toolkit.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Ma che tipo di immagini puoi ricevere? Potresti anche ritagliare il cerchio centrale e disegnarlo su uno sfondo trasparente credo, ma dovresti conoscere a priori la posizione, almeno di non voler usare algoritmi particolari ...

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2017
    Messaggi
    19
    non ho mai lavorato con le immagini e quindi la gestione dei canali e dei pixel...
    Ho pensato ad una strada meno pulita, ma più breve e ti chiedo se è fattibile, cioè: conoscendo la dimensione dell'immagine, è possibile ritagliarla a forma di cerchio?

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Sì, è possibile, ma dopo qualche prova non ottengo chissà che risultato.

    Non ho ancora capito se l'immagine che ottieni sia sempre simile a quella che hai postato, o cosa possa cambiare tra una e l'altra, comunque conoscendo a priori altezza e larghezza (nel codice sotto uso una BufferedImage per l'immagine originale, ma da sun.awt.image.ToolkitImage dovresti comunque essere in grado di trovare altezza e larghezza, e stando a questo link potresti anche usare il metodo getBufferedImage () sulla tua ToolkitImage, anche se non so se funzioni) dovresti essere in grado di tagliare un ellisse settando la clip dell'oggetto Graphics corrispondente.

    Ecco un frammento di codice che ho pescato online e riadattato un pochino (qua si assume che l'immagine sia quadrata, come quella che hai postato, ma è facile generalizzare):

    codice:
    import java.awt.Graphics2D;
    import java.awt.geom.Ellipse2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.JOptionPane;
    public class Test
    {
    	public static void main (String [] a) throws Exception {
    		BufferedImage image = ImageIO.read (new File ("C:/Users/Francesco/Desktop/1.png"));
    		int width = image.getWidth ();
    		BufferedImage circleBuffer = new BufferedImage (width, width, BufferedImage.TYPE_INT_ARGB);
    		Graphics2D g2 = circleBuffer.createGraphics ();
    		g2.setClip (new Ellipse2D.Float (0, 0, width, width));
    		g2.drawImage (image, 0, 0, width, width, null);
    		JOptionPane.showMessageDialog (null, new ImageIcon (circleBuffer));
    	}
    }
    Ottieni questo:

    Cattura.JPG

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2017
    Messaggi
    19
    si, così funziona. Grazie mille!

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 © 2024 vBulletin Solutions, Inc. All rights reserved.