2008-12-12 4 views
12

Ich entwickle ein Webalbum mit Grails und für die Bildverarbeitung verwende ich das Plugin grails-image-tools. Ich brauche eine Funktion, um die Größe der Bilder zu ändern, wenn die Größe der hochgeladenen Bilder zu groß ist (zB: mehr als 600 * 840). In diesem Fall muss das Bild auf 600 * 840 skaliert werden. Was ist der effizienteste Weg, dies zu tun? Danke vielmals.Bildgröße in Grails

Antwort

7
import java.awt.Image as AWTImage 
import java.awt.image.BufferedImage  
import javax.swing.ImageIcon 
import javax.imageio.ImageIO as IIO 
import java.awt.Graphics2D 


static resize = { bytes, out, maxW, maxH -> 
    AWTImage ai = new ImageIcon(bytes).image 
    int width = ai.getWidth(null) 
    int height = ai.getHeight(null) 

    def limits = 300..2000 
    assert limits.contains(width) && limits.contains(height) : 'Picture is either too small or too big!' 

    float aspectRatio = width/height float requiredAspectRatio = maxW/maxH 

    int dstW = 0 
    int dstH = 0 
    if (requiredAspectRatio < aspectRatio) { 
     dstW = maxW dstH = Math.round(maxW/aspectRatio) 
    } else { 
     dstH = maxH dstW = Math.round(maxH * aspectRatio) 
    } 

    BufferedImage bi = new BufferedImage(dstW, dstH, BufferedImage.TYPE_INT_RGB)    
    Graphics2D g2d = bi.createGraphics() g2d.drawImage(ai, 0, 0, dstW, dstH, null, null) 

    IIO.write(bi, 'JPEG', out) 
} 
+0

dies obwohl das Bild dreht .... – hvgotcodes

+0

@hvgotcodes alte Frage, Der Grund dafür ist, dass das Bild nicht wirklich gedreht wird. Es verfügt lediglich über EXIF-Daten, die Fotobetrachter (wie Browser) anweisen, das Bild gedreht anzuzeigen. Einige Kameras (und insbesondere Telefone) tun dies, anstatt das Bild tatsächlich zu drehen. Da das Bild nicht wirklich gedreht wird und die Java-APIs die EXIF-Rotationsdaten nicht betrachten, scheint das Bild gedreht zu werden, obwohl dies in Wirklichkeit nicht der Fall ist. Hier ist [ein Beispiel] (https://gist.github.com/9re/1990019) Code, der die EXIF-Daten überprüft und entsprechend rotiert. –

1

Verwenden Sie das ImageTool-Plugin. http://grails.org/ImageTools+plugin

+0

Irgendeine Idee, wenn es mit Grails 2 kompatibel ist? Ist es notwendig, mich selbst von Git zu bauen oder funktioniert auch die neueste Version 0.1? –

12

In BuildConfig.groovy fügen Sie eine Abhängigkeit zu imgscalr

dependencies { 
    compile 'org.imgscalr:imgscalr-lib:4.1'  
} 

Dann Größe der Bilder wird ein Einzeiler:

BufferedImage thumbnail = Scalr.resize(image, 150); 
+0

Don wird es die Qualität des Bildes beibehalten. Da ich Grails imageTools Plugin benutze, ist die Qualität des erstellten Bildes sehr schlecht – Wasim

+0

@Charsee Ich bin sehr zufrieden mit der Bildqualität –

+0

Oh Great !!! Danke Don :) – Wasim