Leggere rgb di ogni pixel di un immagine con java

di il
30 risposte

Leggere rgb di ogni pixel di un immagine con java

Devo prnedere un immagine.
Di questa immagine devo prendere pixel perpixel.
Di ogni pixel devo sapere il codice rgb

come faccio a fare questa cosa?

30 Risposte

  • Re: Leggere rgb di ogni pixel di un immagine con java

    fifififi ha scritto:


    Devo prnedere un immagine.
    Di questa immagine devo prendere pixel perpixel.
    Di ogni pixel devo sapere il codice rgb

    come faccio a fare questa cosa?
    La API ImageIO (package javax.imageio) fornisce in lettura un BufferedImage e questo ha i metodi per leggere/settare i singoli pixel.

    Comunque descrivi meglio la tua necessità, devi operare sui pixel per quale motivo?
  • Re: Leggere rgb di ogni pixel di un immagine con java

    Stiamo facendo la steganografia e dobbiamo fare un esercizio. Cmnq hai già risposto alla domanda. Molto gentile,come sempre. Se avrò ancora bisogno tornerl grazie mille ancora.
  • Re: Leggere rgb di ogni pixel di un immagine con java

    fifififi ha scritto:


    Stiamo facendo la steganografia e dobbiamo fare un esercizio.
    Ahhh ho capito. Allora ok, ha senso.
    Tieni anche presente che in questo contesto dovresti usare formati di immagini "lossless", senza perdita di qualità. Quindi NON jpeg (anche se teoricamente e avendo più controllo sull'algoritmo di codifica qualcosa è sicuramente possibile fare ... così mi pare di aver letto in passato). E scartando le gif che sono index (palette) based, il formato più utile e pratico alla fin fine è il png.
  • Re: Leggere rgb di ogni pixel di un immagine con java

    andbin ha scritto:


    fifififi ha scritto:


    il formato più utile e pratico alla fin fine è il png.
    sicuro? Perché mi sembra che il png sia in parte trasparente. Sto usando il bmp.

    Ma ho un'altra domanda:
    Praticamente il programma deve funzionare sia sul mio computer che su un altro computer quindi come faccio per il percorso file? Senza dove stare a modificare il codice del percorso file ogni volta... Ci sarà un modo....
  • Re: Leggere rgb di ogni pixel di un immagine con java

    fifififi ha scritto:


    andbin ha scritto:


    fifififi ha scritto:


    il formato più utile e pratico alla fin fine è il png.
    sicuro? Perché mi sembra che il png sia in parte trasparente. Sto usando il bmp.
    Quello a cui mi riferivo prima non riguarda la capacità di gestire il canale "alpha" (la trasparenza) né al numero di bit-per-pixel gestibili dal formato.
    I formati immagine/audio/video si possono dividere in due grosse categorie: "lossy" e "lossless". Quelli lossy perdono qualità durante la compressione. Il formato JPEG è uno di questi. PNG, BMP e GIF sono invece lossless (a parte il fatto che GIF non va oltre i 256 colori, quindi se hai una immagine "true color" 24bit/pixel e la salvi in GIF, ovviamente PERDE in qualità).

    I formati lossy NON li puoi usare per la steganografia ... a meno di avere pieno controllo sulla compressione e una elevatissima conoscenza dell'algoritmo usato.

    PNG va bene (e comprime pure bene). BMP va ANCHE bene, non ti preoccupare. Solo che BMP normalmente non è compresso (hai file grossi) e l'unico algoritmo di compressione usabile se ben ricordo è il RLE (Run Length Encoding) che però non so dire ora se la ImageIO supporta/applica in scrittura.

    fifififi ha scritto:


    Praticamente il programma deve funzionare sia sul mio computer che su un altro computer quindi come faccio per il percorso file? Senza dove stare a modificare il codice del percorso file ogni volta... Ci sarà un modo....
    - lo passa l'utente come "argomento" (del main(String[] args) ) all'avvio della applicazione
    - lo si fa inserire dall'utente su standard-input a runtime (se è una applicazione "console")
    - lo si fa scegliere dall'utente tramite JFileChooser (se è una applicazione "grafica" in Swing)
  • Re: Leggere rgb di ogni pixel di un immagine con java

    Ho finito il programma ma c'è un problema.
    Gli faccio stampare il codice ascii delle lettere del testo e queste le fa giuste ma se ci metto davanti (char) mi stampa caratteri tutti sbagliati, che problema c'è?
    i numeri del codice ascii so che li fa giusti perché controllo numero per numero che viene stampato su google e riporta le lettere giuste.
  • Re: Leggere rgb di ogni pixel di un immagine con java

    fifififi ha scritto:


    Ho finito il programma ma c'è un problema.
    Gli faccio stampare il codice ascii delle lettere del testo e queste le fa giuste ma se ci metto davanti (char) mi stampa caratteri tutti sbagliati, che problema c'è?
    i numeri del codice ascii so che li fa giusti perché controllo numero per numero che viene stampato su google e riporta le lettere giuste.
    Ma c'entra (e come?) con l'argomento della steganografia??
  • Re: Leggere rgb di ogni pixel di un immagine con java

    L'esercizio consisteva nel
    - prendere un'immagine
    - prendere il suo codice in rgb decimale
    - trasformarlo in binario
    - prendere un testo e trasformarlo in binario
    - sostituire i bit meno significativi del binario rgb coi bit de testo.

    Fare l'operazione opposta nel secondo esercizio, ossia hai un'immagine già modificata e vuoivedere il testo nascosto andando a vedere tutti i bit meno significativi.

    provo a fare un esempio
    l'immagine è fatta di pixel
    ogni pixel avrà un codice rgb esempoio 80 90 123
    questi li trasformo tutti in binario
    10010111
    10111110
    10100001
    10010110
    10111010
    10100000
    10010000
    10111111



    poi prendo lettera per lettera di un testo, ne prendo il codice ascii e lo trasformo in binario mettiamo 10100100
    e questi numeri in binario li metterò nel bit meno significativo che è quello in fondo e diventerà così

    10010111
    10111110
    10100001
    10010110
    10111010
    10100001
    10010000
    10111110

    spero di essermi spiegata...
  • Re: Leggere rgb di ogni pixel di un immagine con java

    Senti mi sono rotta, il codice è tutto sbagliato lo rifaccio per la quarta volta.
  • Re: Leggere rgb di ogni pixel di un immagine con java

    fifififi ha scritto:


    - prendere il suo codice in rgb decimale
    - trasformarlo in binario
    Per i pixel, non c'entra qui adesso il "decimale". Il getRGB di BufferedImage ti fornisce il colore del pixel come 32 bit nel formato ARGB.

    fifififi ha scritto:


    - prendere un testo e trasformarlo in binario
    Se hai un String, è bene codificare la stringa in sequenza di byte secondo un charset ben preciso e "stabile" (cioè noto sia per codifica che decodifica) es. UTF-8.
    Se non stabilisci un charset, ci possono essere problemi di "portabilità".

    fifififi ha scritto:


    - sostituire i bit meno significativi del binario rgb coi bit de testo.
    Se intendi occupare 1 bit di informazione in ciascun singolo pixel, allora per uno stream di N byte avrai bisogno di N*8 pixel. Se scegli il bit meno significativo del BLU, è meglio (tra l'altro nel formato ARGB è già quello meno significativo!) perché l'occhio umano è meno sensibile al blu.


    Quale è il dubbio o problema esattamente? Mostra del codice.
  • Re: Leggere rgb di ogni pixel di un immagine con java

    Ho capito solo l'ultimo punto che hai detto.
    Il profe ha detto di fare l'esercizio così. Adesso lo rifaccio tutto da capo.

    L'inizio funziona sempre cmnq. Faccio un for dove leggo pixel per pixel e di questo prendo il codice rgb e questo funziona.
  • Re: Leggere rgb di ogni pixel di un immagine con java

    fifififi ha scritto:


    Ho capito solo l'ultimo punto che hai detto.
    Il profe ha detto di fare l'esercizio così.
    Per il testo in sequenza di byte:

    byte[] bytes = testo.getBytes("UTF-8");

    è tutto qui, non c'è molto.

    Per estrarre i singoli bit da ciascun byte, ci sono alcuni modi che sfruttano le operazioni bit-wise (sui bit) tra cui shift e AND.

    Per operare sul int fornito da getRGB è una cosa simile, operazioni di shift e/o AND e/o OR. Non ho capito se vuoi sfruttare 1 bit per ciascun R G e B oppure un solo canale. La differenza non è molta ma cambia ovviamente la logica.
  • Re: Leggere rgb di ogni pixel di un immagine con java

    Senti facciamo così, man mano facio il programma te lo passo perché non ne posso davvero più
  • Re: Leggere rgb di ogni pixel di un immagine con java

        
        public static int funzione(int numero, char lettera) {
            if (numero % 2 == 0 && lettera == '1') {
                numero++;
            } else if (numero % 2 == 1 && lettera == '0') {
                numero--;
            }
            return numero;
        }
    
        public static void main(String[] args) {
            ArrayList<Integer> rgb = new ArrayList<Integer>();
            try {
                BufferedImage immagine = ImageIO.read(new File("IMMAGINI\\palla.bmp"));
    
                int larghezza = immagine.getWidth();
                int altezza = immagine.getHeight();
    
                for (int l = 0; l < larghezza; l++) {
                    for (int a = 0; a < altezza; a++) {
                        Color colore = new Color(immagine.getRGB(l, a));
                        int numero = funzione(colore.getRed(), lettera);
                        numero = funzione(colore.getGreen(), lettera);
                        numero = funzione(colore.getBlue(), lettera);
    
                    }
                }
    
            } catch (Exception e) {
            }
    
        }
    per ora questo codice funziona. Stampa i colori rgb giusti.
    Adesso devo fare la funzione che prende il testo e lo trasforma in codice binario. come si fa?
Devi accedere o registrarti per scrivere nel forum
30 risposte