在很多项目中我们会把上传的图片做处理,比较图片上传过多对服务器的容量和带宽有很多的浪费,如果不是必须的高清图片,我们可以通过代码来做压缩。在我的项目中我们压缩图片的目的是让web页面打开的速度很快,并且节省空间。
下面先分享一下代码:
package org.util; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.CropImageFilter; import java.awt.image.FilteredImageSource; import java.awt.image.ImageFilter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class ImgTools { /** * 按照 宽高 比例压缩 * * @param img * @param width * @param height * @param out * @throws IOException */ public static void thumbnail_w_h(File img, int width, int height, OutputStream out) throws IOException { BufferedImage bi = ImageIO.read(img); double srcWidth = bi.getWidth(); // 源图宽度 double srcHeight = bi.getHeight(); // 源图高度 double scale = 1; if (width > 0) { scale = width / srcWidth; } if (height > 0) { scale = height / srcHeight; } if (width > 0 && height > 0) { scale = height / srcHeight < width / srcWidth ? height / srcHeight : width / srcWidth; } thumbnail(img, (int) (srcWidth * scale), (int) (srcHeight * scale), out); } /** * 按照固定宽高原图压缩 * * @param img * @param width * @param height * @param out * @throws IOException */ public static void thumbnail(File img, int width, int height, OutputStream out) throws IOException { BufferedImage BI = ImageIO.read(img); Image image = BI.getScaledInstance(width, height, Image.SCALE_SMOOTH); BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = tag.getGraphics(); g.setColor(Color.RED); g.drawImage(image, 0, 0, null); // 绘制处理后的图 g.dispose(); ImageIO.write(tag, "JPEG", out); } /** * 按照宽高裁剪 * * @param srcImageFile * @param destWidth * @param destHeight * @param out */ public static void cut_w_h(File srcImageFile, int destWidth, int destHeight, OutputStream out) { cut_w_h(srcImageFile, 0, 0, destWidth, destHeight, out); } public static void cut_w_h(File srcImageFile, int x, int y, int destWidth, int destHeight, OutputStream out) { try { Image img; ImageFilter cropFilter; // 读取源图像 BufferedImage bi = ImageIO.read(srcImageFile); int srcWidth = bi.getWidth(); // 源图宽度 int srcHeight = bi.getHeight(); // 源图高度 if (srcWidth >= destWidth && srcHeight >= destHeight) { Image image = bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT); cropFilter = new CropImageFilter(x, y, destWidth, destHeight); img = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(image.getSource(), cropFilter)); BufferedImage tag = new BufferedImage(destWidth, destHeight, BufferedImage.TYPE_INT_RGB); Graphics g = tag.getGraphics(); g.drawImage(img, 0, 0, null); // 绘制截取后的图 g.dispose(); // 输出为文件 ImageIO.write(tag, "JPEG", out); } } catch (Exception e) { e.printStackTrace(); } }// #cut_w_h public static void main(String[] args) throws IOException { File img = new File("e:\\a\\a.jpg"); FileOutputStream fos = new FileOutputStream("e:\\a\\b.jpg"); // ImgTools.thumbnail(img, 100, 100, fos); // ImgTools.cut_w_h(img, 230, 200, fos); ImgTools.thumbnail_w_h(img, 100, 0, fos); } }
其实我们很多人喜欢在上传的时候就做了限制了,这样在上传时就节省了带宽,可是很多客户是不会做图片处理的,5M的大图直接就给你上传,限制了说我们做的不人性化。无奈之下只能在后台进行转换。
相关文件主要来自网络和个人编程。支持转载