Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [Java] Rotazione e acquisizione RGB

    Salve, sono un novellino di java e i miei problemi sostanzialmente sono 2:
    -Come faccio a far ruotare una variabile di tipo img e poi rimemorizzarla girata?
    -E' possibile acquisire il colore di un'immagine in un determinato punto? Cioè esiste un comando che mi ritorni un int o anche una string che rappresenti il colore del pixel corrispondente alle coordinate che gli passo?
    Vi prego aiutatemi!!
    Matteo

  2. #2
    utilizza le classi BufferedImage e AffineTrasform

    Per la rotazione:
    codice:
    AffineTransform tx = new AffineTransform();
    //radians rappresenta i gradi di rotazione che vuoi
    tx.rotate(radians , tuaBufferedImage.getWidth()/2, tuaBufferedImage.getHeight()/2);
        
    AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
    tuaBufferedImage = op.filter(tuaBufferedImage, null);
    Per il colore RGB:
    codice:
    // Preleva un pixel
    int rgb = bufferedImage.getRGB(x, y);
        
    // Preleva tutti i pixel
    int w = bufferedImage.getWidth(null);
    int h = bufferedImage.getHeight(null);
    int[] rgbs = new int[w*h];
    bufferedImage.getRGB(0, 0, w, h, rgbs, 0, w);
    Al mio segnale... scatenate l'inferno!

  3. #3
    Perfetto! Sei un grande!!

  4. #4
    Utente di HTML.it L'avatar di nerd
    Registrato dal
    Jun 2005
    Messaggi
    15
    Originariamente inviato da R@ve M@ster
    utilizza le classi BufferedImage e AffineTrasform

    Per la rotazione:
    codice:
    AffineTransform tx = new AffineTransform();
    //radians rappresenta i gradi di rotazione che vuoi
    tx.rotate(radians , tuaBufferedImage.getWidth()/2, tuaBufferedImage.getHeight()/2);
        
    AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
    tuaBufferedImage = op.filter(tuaBufferedImage, null);
    Io ho il problema che un immagine qualsiasi ruotata di ad es. 20° non mantiene gli angoli di 90°. Ottengo cioè un parallelogramma.
    Il codice è:
    codice:
        public BufferedImage rotate(Image i, double deg) {
            BufferedImage bufferedImage = ImageUtils.toBufferedImage(i);
    
            AffineTransform tx = new AffineTransform();
            tx.rotate(Math.toRadians(deg), i.getWidth(null) / 2, i.getHeight(null) / 2);
    
            AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
            bufferedImage = op.filter(bufferedImage, null);
            return bufferedImage;
        }
    Se invece uso:
    codice:
        public BufferedImage myRotate(Image i, double degree) {
            AffineTransform at = new AffineTransform();
            at.rotate(Math.toRadians(degree), (i.getWidth(null) / 2), (i.getHeight(null) / 2));
            BufferedImage b = new BufferedImage(i.getWidth(null), i.getHeight(null), BufferedImage.TYPE_INT_RGB);
            Graphics2D g = b.createGraphics();
            g.drawImage(i, at, null);
            g.dispose();
            return b;
        }
    ottengo un immagine con angoli a 90° ma con gli spazi lasciati vuoti dalla rotazione neri e non trasparenti come nel primo caso.

    Qualcuno sa darmi una mano?

    Grazie
    Oh quanto è bello essere stupidi!

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da nerd
    ma con gli spazi lasciati vuoti dalla rotazione neri e non trasparenti come nel primo caso.
    BufferedImage.TYPE_INT_ARGB
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it L'avatar di nerd
    Registrato dal
    Jun 2005
    Messaggi
    15
    Grazie,
    adesso non mi fa vedere più gli spazi neri ma ho ancora il problema con gli angoli dell'immagine. Forse è una cosa normale e sono io che non capisco:

    La mia funzione adesso è:
    codice:
        public BufferedImage myRotate(Image i, double degree) {
            int w = i.getWidth(null);
            int h = i.getHeight(null);
            double angle = Math.toRadians(degree);
            double sin = Math.abs(Math.sin(angle));
            double cos = Math.abs(Math.cos(angle));
            int neww = (int) Math.floor(w * cos + h * sin);
            int newh = (int) Math.floor(h * cos + w * sin);
            AffineTransform at = new AffineTransform();
    
            at.scale((w + 0.0) / (neww + 0.0), (h + 0.0) / (newh + 0.0));
            at.translate((neww - w) / 2, (newh - h) / 2);
            at.rotate(angle, w/ 2, h/ 2);
    
            BufferedImage b = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g = b.createGraphics();
            g.drawImage(i, at, null);
            g.dispose();
            return b;
    Facendo così però l'immagine è ancora un parallelogramma. Se rimuovo l'operazione di scale o translate ottengo angoli a 90° ma l'immagine non è centrata.

    Ecco due esempi: (lo sfondo nero è l'immagine originale,ce l'ho messo apposta )

    Immagine con angoli dritti:


    Immagine a parallelogramma:


    Qualcuno ha qualche idea?

    Grazie
    Oh quanto è bello essere stupidi!

  7. #7
    Utente di HTML.it L'avatar di nerd
    Registrato dal
    Jun 2005
    Messaggi
    15
    Nessuno che abbia mai avuto questo problema?
    Oh quanto è bello essere stupidi!

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.