Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 22
  1. #11
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    4

    ECCO IL CODICE...

    Ecco il brano di codice ,dalla modifica del vettore di pixel (pixels) all' estrazione del messaggio, qui dovrebbe nascondersi l' errore...

    BufferedImage buffImage2 = new BufferedImage(imgCols,imgRows,BufferedImage.TYPE_I NT_ARGB);
    WritableRaster r=buffImage2.getRaster();
    r.setDataElements(0,0,imgCols,imgRows,pixels);
    buffImage2.setData(r);

    String ext="png";
    ImageIO.write(buffImage2,ext,new File("Image."+ext));

    // Invece di setDataElements e setData per ricreare l' immagine modificata da pixels si potrebbe // anche fare Image img=createImage(new MemoryImageSource(imgCols,imgRows,pixels,0,imgCols )) solo // che questa procedura costruisce una "Image",mentre ImageIO.write() funziona solo con // BufferedImage.
    // Si può cmq passare da Image a BufferedImage con Graphics,ma i problemi sono sorti in entrambi i // casi quindi non credo sia lì il problema...
    // ... spero solo che non sia il metodo write, nel momento in cui crea la "png",che taglia o // modifica alcuni bit se no mi sa che il mio progetto dovrà essere quasi smantellato.

    try
    {
    BufferedImage image = ImageIO.read(new File("Image.png"));
    }
    catch(Exception ex)
    {
    JOptionPane.showMessageDialog(null,
    "Errore nella lettura dell' immagine!","Errore!",JOptionPane.ERROR_MESSAGE);
    }

    // Fin qui apre l' immagine modificata,salvata in "Image.png"

    BufferedImage bi = new BufferedImage(image.getWidth(null),image.getHeight (null),BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = bi.createGraphics();

    g.drawRenderedImage(image, null);
    DataBufferInt dataBufferInt = (DataBufferInt)bi.getRaster().getDataBuffer();

    int[] pixels = dataBufferInt.getData();

    // Dopodichè parte la procedura di estrazione (da pixels), che non presenta errori.

  2. #12
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    A me funziona, pero' ho estatto il valore di ogni pixel con il metodo getRGB() di BufferedImage senza bassare dai raster. Ti posto il codice, provalo e guarda se puoi adattarlo al tuo caso.
    codice:
    package crypto;
    
    import java.awt.image.*;
    import java.io.*;
    import javax.imageio.ImageIO;
    
    public class CriptTest {
        private static String msg = "Cantami, o Diva, del Pelide Achille " +
                "l'ira funesta che infiniti addusse "+
                "lutti agli Achei, molte anzi tempo all'Orco "+
                "generose travolse alme d'eroi, "+
                "e di cani e d'augelli orrido pasto "+
                "lor salme abbandonò (così di Giove "+
                "l'alto consiglio s'adempia), da quando "+
                "primamente disgiunse aspra contesa "+
                "il re de' prodi Atride e il divo Achille.\nIncipit ILIADE";
        
        public static void main(String[] args) {
            //Leggo l'immagine
            File imgFile = new File("C:/Documents and Settings/Simone/Desktop/preview.png");
            BufferedImage source = null;
            try {
                source = ImageIO.read(imgFile);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            
            //Creo l'immagine di destinazione
            BufferedImage dest = new BufferedImage(source.getWidth(),source.getHeight(),BufferedImage.TYPE_INT_ARGB);
            
            //Per comodita tratto char come se fosse int
            //Ciclo sui pixel e modifico pixel per pixel mettendo in xor 2 bit del carattere
            //con i bit meno significativi di ogni canale
            int tmp, pixel, index;
            for(int i=0; i<source.getWidth(); i++) {
                for(int j=0; j<source.getHeight(); j++) {
                    pixel = source.getRGB(i,j);
                    index = (i*source.getHeight())+j;
                    if(index<msg.length()) {
                        tmp = msg.charAt(index);
                        int chan_1 = tmp>>6;
                        int chan_2 = (tmp^(chan_1<<6))>>4;
                        int chan_3 = (tmp^(chan_1<<6)^(chan_2<<4))>>2;
                        int chan_4 = (tmp^(chan_1<<6)^(chan_2<<4)^(chan_3<<2));
                        pixel = pixel^(chan_1<<24)^(chan_2<<16)^(chan_3<<8)^(chan_4);
                    }
                    dest.setRGB(i,j,pixel);
                }
            }
            
            //Salvo l'immagine
            String ext="png";
            imgFile = new File("C:/Documents and Settings/Simone/Desktop/Image."+ext);
            try {
                ImageIO.write(dest,ext,imgFile);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            
            //Riprova, leggo l'immagine e con il procedimento inverso estraggo i caratteri da ogni pixel
            BufferedImage imgMod = null;
            try {
                imgMod = ImageIO.read(imgFile);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            for(int i=0; i<imgMod.getWidth(); i++) {
                for(int j=0; j<imgMod.getHeight(); j++) {
                    int tmp2 = imgMod.getRGB(i,j)^source.getRGB(i,j);
                    int chan_1 = tmp2>>24;
                    int chan_2 = (tmp2^(chan_1<<24))>>16;
                    int chan_3 = (tmp2^(chan_1<<24)^(chan_2<<16))>>8;
                    int chan_4 = (tmp2^(chan_1<<24)^(chan_2<<16)^(chan_3<<8));
                    char c = (char)((chan_1<<6)^(chan_2<<4)^(chan_3<<2)^(chan_4));
                    if(c!=0) {
                        System.out.print(c);
                    }
                }
            }
        }
    }

  3. #13

    Pixel e Testo

    ciao Simo, sono nuovo(o quasi), ho visto il tuo programmino ma non riescoa capire una cosa...la stringa "img" va a finire nell'immagine,giusto? come faccio a vederla di nuovo prendendo l'immagine salvata(la seconda ed ultima parte)?Grazie per la pazienza

  4. #14
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Si, la stringa msg va a finire nell'immagine. Per riprenderla ti servono sia l'immagine originale che quella salvata. Se non ricordo male, la seconda parte consiste in questo: leggo dal file l'immagine modificata(che ha il messaggio criptato al suo interno), con i due for ciclo sui singoli pixel dell'immagine, per ogni pixel faccio uno xor con il pixel dell'immagine originale per ottenere solo i bit modificati e il loro valore, con degli shift sui bit isolo i singoli canali di ogni pixel(R,G,B,alpha), concateno i bit dei singoli canali per ottenere il carattere e stampo il carattere. Naturalmente il programma cosi' non serve a granche'. Andrebbero isolate le due parti, inserite in appositi metodi che accettano come parametro immagini e messaggio, ecc.

  5. #15

    Pixel

    scusa se insisto, ma non capisco...hai detto che servono sia l'immagine originale che quella salvata. ho tutt'e due nel Desktop, ma nella console(di Eclipse) mi mostra solo il testo criptato e non la frase di "msg".non capisco questa cosa.

  6. #16
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    L'ho riprovato ed a me non da errori...
    Hai modificato il codice in qualche punto?

  7. #17

    Pixel

    scusa non capisco che devo cambiare nel codice...

  8. #18
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Era una domanda...
    Prendi il codice, metti un immagine di tipo .png sul desktop, cambia il path e prova.
    Ti va?

  9. #19
    perdona la mia idiozia...potresti dirmi i passaggi che fai?(del primo all'ultimo)
    grazie

  10. #20
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    1) Vai su google>immagini>ricerca avanzata>seleziona come formato PNG
    2) Salva l'immagine da qualche parte sul tuo pc
    3) Apri il tuo editor(blocco note, netbeans, eclipse o quello che usi tu)
    4) Incolla il codice sotto
    codice:
    package crypto;
    
    import java.awt.image.*;
    import java.io.*;
    import javax.imageio.ImageIO;
    
    public class CriptTest {
        private static String msg = "Cantami, o Diva, del Pelide Achille " +
                "l'ira funesta che infiniti addusse "+
                "lutti agli Achei, molte anzi tempo all'Orco "+
                "generose travolse alme d'eroi, "+
                "e di cani e d'augelli orrido pasto "+
                "lor salme abbandonò (così di Giove "+
                "l'alto consiglio s'adempia), da quando "+
                "primamente disgiunse aspra contesa "+
                "il re de' prodi Atride e il divo Achille.\nIncipit ILIADE";
        
        public static void main(String[] args) {
            //Leggo l'immagine
            File imgFile = new File("C:/Documents and Settings/Simone/Desktop/preview.png");
            BufferedImage source = null;
            try {
                source = ImageIO.read(imgFile);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            
            //Creo l'immagine di destinazione
            BufferedImage dest = new BufferedImage(source.getWidth(),source.getHeight(),BufferedImage.TYPE_INT_ARGB);
            
            //Per comodita tratto char come se fosse int
            //Ciclo sui pixel e modifico pixel per pixel mettendo in xor 2 bit del carattere
            //con i bit meno significativi di ogni canale
            int tmp, pixel, index;
            for(int i=0; i<source.getWidth(); i++) {
                for(int j=0; j<source.getHeight(); j++) {
                    pixel = source.getRGB(i,j);
                    index = (i*source.getHeight())+j;
                    if(index<msg.length()) {
                        tmp = msg.charAt(index);
                        int chan_1 = tmp>>6;
                        int chan_2 = (tmp^(chan_1<<6))>>4;
                        int chan_3 = (tmp^(chan_1<<6)^(chan_2<<4))>>2;
                        int chan_4 = (tmp^(chan_1<<6)^(chan_2<<4)^(chan_3<<2));
                        pixel = pixel^(chan_1<<24)^(chan_2<<16)^(chan_3<<8)^(chan_4);
                    }
                    dest.setRGB(i,j,pixel);
                }
            }
            
            //Salvo l'immagine
            String ext="png";
            imgFile = new File("C:/Documents and Settings/Simone/Desktop/Image."+ext);
            try {
                ImageIO.write(dest,ext,imgFile);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            
            //Riprova, leggo l'immagine e con il procedimento inverso estraggo i caratteri da ogni pixel
            BufferedImage imgMod = null;
            try {
                imgMod = ImageIO.read(imgFile);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            for(int i=0; i<imgMod.getWidth(); i++) {
                for(int j=0; j<imgMod.getHeight(); j++) {
                    int tmp2 = imgMod.getRGB(i,j)^source.getRGB(i,j);
                    int chan_1 = tmp2>>24;
                    int chan_2 = (tmp2^(chan_1<<24))>>16;
                    int chan_3 = (tmp2^(chan_1<<24)^(chan_2<<16))>>8;
                    int chan_4 = (tmp2^(chan_1<<24)^(chan_2<<16)^(chan_3<<8));
                    char c = (char)((chan_1<<6)^(chan_2<<4)^(chan_3<<2)^(chan_4));
                    if(c!=0) {
                        System.out.print(c);
                    }
                }
            }
        }
    }
    5) Modifica le parti in rosso in modo che la prima punti al file che hai scaricato (l'immagine originale) e la seconda ad una directory qualsiasi del tuo sistema (dove salvera' l'immagine modificata)
    6) Salva il file come CriptTest, mettilo nel package crypto, compila ed esegui.

    Ti funziona?

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