在使用playframework的时候,发现框架提供了一个Image类,这个类可以实现生成指定大小的图片功能,我们来看下这个类:
/** * Resize an image * @param originalImage The image file * @param to The destination file * @param w The new width (or -1 to proportionally resize) * @param h The new height (or -1 to proportionally resize) */ public static void resize(File originalImage, File to, Integer w, Integer h) { try { BufferedImage source = ImageIO.read(originalImage); int owidth = source.getWidth(); int oheight = source.getHeight(); double ratio = (double) owidth / oheight; if (w < 0 && h < 0) { w = owidth; h = oheight; } if (w < 0 && h > 0) { w = (int) (h * ratio); } if (w > 0 && h < 0) { h = (int) (w / ratio); } String mimeType = "image/jpeg"; if (to.getName().endsWith(".png")) { mimeType = "image/png"; } if (to.getName().endsWith(".gif")) { mimeType = "image/gif"; } // out BufferedImage dest = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Image srcSized = source.getScaledInstance(w, h, Image.SCALE_SMOOTH); Graphics graphics = dest.getGraphics(); graphics.setColor(Color.WHITE); graphics.fillRect(0, 0, w, h); graphics.drawImage(srcSized, 0, 0, null); ImageWriter writer = ImageIO.getImageWritersByMIMEType(mimeType).next(); ImageWriteParam params = writer.getDefaultWriteParam(); FileImageOutputStream toFs = new FileImageOutputStream(to); writer.setOutput(toFs); IIOImage image = new IIOImage(dest, null, null); writer.write(null, image, params); toFs.flush(); toFs.close(); } catch (Exception e) { throw new RuntimeException(e); } }
上传一个图片,重新生成一个100×100像素大小的图片,并存放在public/images/目录下。
File attachment是上传文件空间file对应的名字,和之前上传文件的一样。
public static void imageresize(File attachment){ if(request.method.equalsIgnoreCase("POST")){ Images.resize(attachment, Play.getFile("public/images/" + attachment.getName()), 100, 100); render(); }else{ render(); } }大功告成。