Java实现图片压缩代码,图片大小转换

来源:互联网 发布:寻龙诀 知乎 编辑:程序博客网 时间:2024/06/05 08:30

在很多项目中我们会把上传的图片做处理,比较图片上传过多对服务器的容量和带宽有很多的浪费,如果不是必须的高清图片,我们可以通过代码来做压缩。在我的项目中我们压缩图片的目的是让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的大图直接就给你上传,限制了说我们做的不人性化。无奈之下只能在后台进行转换。

原创粉丝点击