Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 15 su 15

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Ho fatto qualche prova con una implementazione di Printable che ho scritto giusto poco fa.

    L'obiettivo che mi sono posto è di stampare una immagine per pagina, usando un algoritmo di scalamento che faccia occupare alla immagine il massimo possibile, ma senza sforare in alcun modo (oltre la area imageable) e mantenendo l'aspect-ratio della immagine.
    Indipendentemente dall'aspect-ratio dell'area rispetto all'aspect-ratio della immagine.

    codice:
    public class MultiPagesImagePrintable implements Printable {
        private final BufferedImage[] images;
    
        public MultiPagesImagePrintable(BufferedImage[] images) {
            this.images = images.clone();
        }
    
        @Override
        public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
            if (pageIndex >= 0 && pageIndex < images.length) {
                Graphics2D g2d = (Graphics2D) graphics;
                AffineTransform oldTransform = g2d.getTransform();
    
                try {
                    printImage(g2d, pageFormat, images[pageIndex]);
                } finally {
                    g2d.setTransform(oldTransform);
                }
    
                return Printable.PAGE_EXISTS;
            } else {
                return Printable.NO_SUCH_PAGE;
            }
        }
    
        private void printImage(Graphics2D g2d, PageFormat pageFormat, BufferedImage image) {
            int imageWidth = image.getWidth();
            int imageHeight = image.getHeight();
    
            double areaX = pageFormat.getImageableX();
            double areaY = pageFormat.getImageableY();
            double areaWidth = pageFormat.getImageableWidth();
            double areaHeight = pageFormat.getImageableHeight();
    
            double scale = Math.min(areaWidth / imageWidth, areaHeight / imageHeight);
    
            g2d.translate(areaX, areaY);
            g2d.scale(scale, scale);
            g2d.drawImage(image, 0, 0, null);
        }
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  2. #2
    ciao!

    intanto grazie per il codice.
    non ho ancora avuto modo di provarlo, però penso di aver capito.
    l'unica cosa che mi sfugge è quel images.clone().

    c'è un motivo particolare per cui ha usato il metodo clone??

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    l'unica cosa che mi sfugge è quel images.clone().

    c'è un motivo particolare per cui ha usato il metodo clone??
    Niente, è solo una "finezza" in più per duplicare l'array in sé (non gli oggetti contenuti). Ma se sei sicuro che l'array passato al costruttore non lo modifichi mentre il print sta facendo le stampe, allora puoi passare direttamente l'array al field.


    Nota: la logica di scalamento che ho scritto è il classico "fit to box" (altrove l'ho visto indicato come "aspect fit", in contrapposizione al "aspect fill"). Ovvero cerca solo di scalare la immagine in modo che occupi il massimo possibile dell'area ma senza sforare. Però non "ruota" automaticamente l'immagine.

    Se hai una immagine più larga che alta ed hai un A4 in verticale, quel Math.min fa scegliere lo scalamento sul areaWidth. Ma così "spreca" più spazio al fondo del foglio. Mentre invece sarebbe più bello se la immagine venisse ruotata così da sfruttare di più l'area. Questo si può fare ma richiede qualche ragionamento in più. Provo a farlo appena mi è possibile.
    Ultima modifica di andbin; 06-02-2018 a 12:24
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Ho ragionato un po' ed ho cambiato la logica in modo da applicare una auto-rotazione se l'orientamento della immagine è tale che sarebbe più appropriato per stamparla girata nell'altro senso sull'area.

    codice:
    class MultiPagesImagePrintable implements Printable {
    
        // ... resto uguale alla precedente versione di MultiPagesImagePrintable
    
        private void printImage(Graphics2D g2d, PageFormat pageFormat, BufferedImage image) {
            int imageWidth = image.getWidth();
            int imageHeight = image.getHeight();
    
            double areaX = pageFormat.getImageableX();
            double areaY = pageFormat.getImageableY();
            double areaWidth = pageFormat.getImageableWidth();
            double areaHeight = pageFormat.getImageableHeight();
    
            g2d.translate(areaX, areaY);
    
            // Verifica se gli orientamenti di area e immagine non coincidono
            if (areaWidth > areaHeight ^ imageWidth > imageHeight) {
                g2d.translate(areaWidth, 0);
                g2d.rotate(Math.PI / 2);   // ruota di +90 gradi
    
                // inverte le lunghezze
                areaHeight = pageFormat.getImageableWidth();
                areaWidth = pageFormat.getImageableHeight();
            }
    
            double scale = Math.min(areaWidth / imageWidth, areaHeight / imageHeight);
    
            g2d.scale(scale, scale);
            g2d.drawImage(image, 0, 0, null);
        }
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    grazie mille!!

    se non mi sentite più vuol dire che funziona alla perfezione!

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.