Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361

    Affiancare due immagini con java

    Salve a tutti ho bisogno del vostro aiuto!
    Come dice il titolo vorrei poter creare un programma in java che prese due immagini da file
    ne crei una terza ottenuta affiancando (in verticale o in orizzontale) le due immagini.
    Ho cercato per un'ora in internet qualche classe utile,come PixelGrabber o BufferedImage,
    se ho capito bene dovrei trasformarmi le due immagini in un vettore di pixel e dopo riscrivere la terza pixel per pixel,c'è qualcuno più esperto di me che lo sa già fare o capisce più in fretta di me?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Come dice il titolo vorrei poter creare un programma in java che prese due immagini da file
    ne crei una terza ottenuta affiancando (in verticale o in orizzontale) le due immagini.
    Da Java 1.4 esiste la API ImageIO (classe principale javax.imageio.ImageIO).
    Con la ImageIO puoi caricare le due immagini e ottieni due BufferedImage. Poi crei un terzo BufferedImage con le dimensioni giuste per l'affiancamento (nel senso di espansione che vuoi). Vedi costruttore BufferedImage(int width, int height, int imageType). Come imageType puoi usare TYPE_INT_ARGB se ti serve il canale alpha oppure solo TYPE_INT_RGB.
    Poi prendi il Graphics/Graphics2D del nuovo BufferedImage e dentro ci "disegni" le due immagini. Fai il dispose() del Graphics(2D) e infine puoi salvare la immagine di nuovo con la ImageIO.

    Segui la documentazione javadoc per le classi indicate ... è più semplice di quanto credi.

    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    se ho capito bene dovrei trasformarmi le due immagini in un vettore di pixel e dopo riscrivere la terza pixel per pixel
    Non serve arrivare ai vettori di pixel.
    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
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Intanto grazie andbin per i consigli sulle classi da usare.Non riesco però a capire come mettere in pratica il procedimento.
    In particolare quando dici "ci disegni" dentro le due immagini intendi usare il dispose() del Graphics(2D) o quello è solo il metodo per
    poi mettere le immagini affiancate dentro al BufferedImage della terza immagine?
    Non trovo infatti un metodo che passi le coordinate al terzo BufferedImage per dire a che punto vanno unite o qualcosa del genere...

    Posto quel poco a cui sono arrivato per ora

    codice:
    
    
    codice:
    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    import java.awt.Graphics;
    public class AffiancaImmagini
    {
        public static void main(String[] args)
        {
            BufferedImage image1=read(new File("C:/Users/Utente/Desktop/1.png"));
            BufferedImage image2=read(new File("C:/Users/Utente/Desktop/2.png"));
             //le immagini sono 53*53 vorrei affiancarle in orizzontale
            BufferedImage image3=new BufferedImage(106,53,TYPE_INT_RGB);
            Graphics im1=image1.getGraphics();
            Graphics im2=image2.getGraphics();
            //vorrei fare qualcosa del tipo image3.dispose(im1);image3.dispose(im2) ma come??    
        }
    }

    Che devo fare adesso? Non capisco proprio niente
    Ultima modifica di LeleFT; 29-01-2015 a 15:37 Motivo: Aggiunti i tag CODE

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    In particolare quando dici "ci disegni" dentro le due immagini intendi usare il dispose() del [COLOR=#333333]Graphics(2D) o quello è solo il metodo per
    poi mettere le immagini affiancate dentro al BufferedImage della terza immagine?
    Il dispose() sul Graphics(2D) serve solo per rilasciare risorse Java/native usate dal Graphics. In questo caso è buona norma farlo, visto che il Graphics lo stai ottenendo e gestendo esplicitamente.

    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Non trovo infatti un metodo che passi le coordinate al terzo BufferedImage per dire a che punto vanno unite o qualcosa del genere...
    Non serve, in questo caso, prendere i Graphics delle due immagini ma solo il Graphics della 3° immagine (quella di destinazione), perché è qui dentro che "disegni" le due immagini.
    Graphics(2D) ha un gran numero di metodi: drawLine, drawRect, drawOval .... e anche drawImage (in svariate varianti). drawImage disegna un (Buffered)Image su un Graphics.

    Segui la documentazione javadoc.
    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
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Ce l'ho fatta!
    Grazie mille per il tempo dedicatomi,se possibile chiedo un'ulteriora cosa prima di lasciarti in pace
    Ho affiancato le due immagini in orizzontale con questo codice:

    codice:
    import java.awt.image.BufferedImage;
    import javax.imageio.ImageIO;
    import java.io.*;
    import java.awt.Graphics;
    public class DisegnaImmagine
    {
        public static void main(String[] args)throws IOException
        {        
            BufferedImage src1=ImageIO.read(new File("C:/Users/Utente/Desktop/1.png"));
            BufferedImage src2=ImageIO.read(new File("C:/Users/Utente/Desktop/2.png"));
            BufferedImage image = new BufferedImage(106,53,BufferedImage.TYPE_INT_RGB); 
            Graphics g=image.getGraphics();
            g.drawImage(src1,0,0,null);
            g.drawImage(src2,53,0,null);
            ImageIO.write(image, "jpg", new File("D:/Prova.png"));
        }     
    }
    Ho utilizzato come suggerito il metodo drawImage(Image img, int x, int y, ImageObserver observer).
    Come ultimo parametro ho passato null perchè non sapevo cosa farci (ho visto degli esempi in internet dove mi è sembrato venissero passati parametri relativi a Jframe,applet o altro) dal momento che non devo visualizzare in qualche finestra l'immagine ma solo scriverla su file.

    Ha senso quello ho fatto?
    Inoltre pensi che questo sia il metodo migliore anche per affiancare più di 50 immagini?




  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Ce l'ho fatta!
    Come vedi sono poche righe in croce.
    Fai anche il dispose() del Graphics dopo i drawImage. Come ho già detto, è buona cosa.

    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    ImageIO.write(image, "jpg", new File("D:/Prova.png"));
    Occhio al formato "jpg" e alla estensione del file.

    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Come ultimo parametro ho passato null perchè non sapevo cosa farci
    Il null è corretto e appropriato. Si passa qualcosa come "osservatore" (tipicamente è un componente grafico, JPanel, ecc...) solo quando il caricamento è asincrono e/o la immagine è animata e si vuole renderizzare la immagine "progressivamente".
    Non è assolutamente questo il caso, visto che la ImageIO carica in modo sincrono e di per sé non supporta immagini (es. GIF) "animate" (BufferedImage è una singola immagine finita, bufferizzata, mai parziale).

    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Inoltre pensi che questo sia il metodo migliore anche per affiancare più di 50 immagini?
    Sì certo, può andare bene. Se il tuo dubbio è come rendere "dinamica" la cosa, ovvero non dover cablare nel codice dimensioni/posizioni (es. quel 106 e 53), beh, basta fare l'algoritmo in modo furbo che sfrutti i getWidth()/getHeight() dei BufferedImage.
    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
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Perfetto,ora aggiungo il dispose() del Graphics, il formato l'avevo già cambiato in png ,ho dimenticato quel pezzetto

    Grazie di tutto!

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.