java 将5mb以内图片压缩至200kb以下

package com.qizhi.itfin.controller.mmb;

import java.io.File;
import java.io.IOException;

import com.qizhi.itfin.common.util.ThumbnailUtils;

public class test {

    public static void main(String[] args) {

        //网络路径地址
        String url = "http://192.168.18。。。:81/upload/img//18/3/b4/ba/e9/37/c7/f7/b4bae937c7f7edf048af44e619d18ef4.jpg";

        url = pictureCompression(url);
        System.err.println(url);
    }

    private static String pictureCompression(String photoUrl) {
        String urls = "http://192.168.18.。。。:81/upload/img/";

       //物理路径
        String path = "X:/img/";

        // 替换后的图片url
        photoUrl = photoUrl.replace(urls, path);
        // 图片小数点之前的数据
        String intNumber = photoUrl.substring(0, photoUrl.indexOf("."));
        // 图片小数点之后的数据
        String lastFileName = photoUrl.substring(photoUrl.lastIndexOf("."));
        // 压缩图片新的路径
        String existPhoto = intNumber + "-thumbnail" + lastFileName;
        // 判断之前是否有生成的压缩图片
        File existPhotoFile = new File(existPhoto);
        String pcZipUrls = null;
        String slash = "\\";
        String leftSlash = "/";
        String canonicalPath = null;
        System.out.println("【压缩图片】物理地址头部信息  " + path);
        System.out.println("【压缩图片】网络地址头部信息  " + urls);
        System.out.println("【压缩图片】转化前的图片路径  " + photoUrl);
        if (existPhotoFile.exists()) {
            try {
                canonicalPath = existPhotoFile.getCanonicalPath();
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("【压缩图片】图片服务器中已经存在exception  " + e);
            }
            pcZipUrls = canonicalPath.replace(slash, leftSlash);
            photoUrl = pcZipUrls.replace(path, urls);
            System.out.println("【压缩图片】图片服务器中已经存在  " + photoUrl);
        } else {
            File file = new File(photoUrl);
            try {
                File makeThumbnail = ThumbnailUtils.makeThumbnail(file, existPhotoFile);
                // 转化成String类型的url
                canonicalPath = makeThumbnail.getCanonicalPath();
                pcZipUrls = canonicalPath.replace(slash, leftSlash);
                photoUrl = pcZipUrls.replace(path, urls);
                System.out.println("【压缩图片】转化后的图片路径  " + photoUrl);
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("【压缩图片】转化后的图片路径exception  " + e);
            }
        }
        return photoUrl;
    }

}
 

图片压缩Utils类

   /**
     * 图片压缩缩略图
     * 
     * @param oldFile
     * @param newFile
     * @return
     * @throws IOException
     */
    public static File makeThumbnail(File oldFile, String uri) throws IOException {
        long fileSize = oldFile.length();
        File resultFile = oldFile;
        String fileUri = uri.substring(0, uri.lastIndexOf("."));
        File newFile = new File(fileUri);
        File newExistFile = new File(uri);
        // 格式转换成jpg
        String lastFileName = oldFile.getName().substring(oldFile.getName().lastIndexOf(".")).toLowerCase();
        if (!StringUtils.equals(lastFileName, ".jpg")) {
            Thumbnails.of(oldFile).scale(1f).outputFormat("jpg").outputQuality(0.8f).toFile(newFile);
            fileSize = newExistFile.length();
            resultFile = newExistFile;
        }
        // 处理文件大小到200K以下
        if (fileSize >= MAX_SIZE) {
            // 第一次将图片尺寸变小,高度固定480
            Thumbnails.of(oldFile).height(480).outputFormat("jpg").outputQuality(0.8f).toFile(newFile);
            fileSize = newExistFile.length();
            // 一般这时图片就在200K以下了,以防万一,循环压缩质量,直到200KB以下
            while (fileSize > MAX_SIZE) {
                Thumbnails.of(newExistFile).scale(1D).outputFormat("jpg").outputQuality(0.8f).toFile(newFile);
                fileSize = newExistFile.length();
            }
            resultFile = newExistFile;
        }
        return resultFile;
    }

 

另外一种图片压缩方式(内存流) 并 转成base64

package com.qizhi.itfin.controller.gps;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

import org.apache.tomcat.util.codec.binary.Base64;

public class test {

    public static void main(String[] args) {
        try {
            String convertImageToBase64 = convertImageToBase64(
                "http://*********/upload/img//18/3/f4/74/90/ff/af/6f/f47490ffaf6f89d027dfe59cfa9e9fda.jpg",
                200);
            System.err.println(convertImageToBase64);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * 将图片转换为base64格式
     *
     * @param imageUrl:图片路径
     * @param sizeLimit:原图大小上限,当图片原图大小超过该值时先将图片大小 设置为该值以下再转换成base64格式,单位kb
     * @return
     */
    public static String convertImageToBase64(String imageUrl, Integer sizeLimit) throws IOException {
        // 默认上限为500k
        if (sizeLimit == null) {
            sizeLimit = 500;
        }
        sizeLimit = sizeLimit * 1024;
        String base64Image;
        DataInputStream dataInputStream = null;
        ByteArrayOutputStream outputStream = null;
        ByteArrayInputStream inputStream = null;
        try {
            // 从远程读取图片
            URL url = new URL(imageUrl);
            dataInputStream = new DataInputStream(url.openStream());
            outputStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[2048];
            int length;
            while ((length = dataInputStream.read(buffer)) > 0) {
                outputStream.write(buffer, 0, length);
            }
            byte[] context = outputStream.toByteArray();

            // 将图片数据还原为图片
            inputStream = new ByteArrayInputStream(context);
            BufferedImage image = ImageIO.read(inputStream);
            int imageSize = context.length;
            int type = image.getType();
            int height = image.getHeight();
            int width = image.getWidth();

            BufferedImage tempImage;
            // 判断文件大小是否大于size,循环压缩,直到大小小于给定的值

            System.out.println(sizeLimit);
            while (imageSize > sizeLimit) {
                System.err.println(imageSize);
                // 将图片长宽压缩到原来的90%
                height = new Double(height * 0.9).intValue();
                width = new Double(width * 0.9).intValue();
                tempImage = new BufferedImage(width, height, type);
                // 绘制缩小后的图
                tempImage.getGraphics().drawImage(image, 0, 0, width, height, null);
                // 重新计算图片大小
                outputStream.reset();
                ImageIO.write(tempImage, "jpg", outputStream);
                imageSize = outputStream.toByteArray().length;

            }

            // 将图片转化为base64并返回
            byte[] data = outputStream.toByteArray();
            File destFile = new File("X:\\vedio\\456.jpg");
            FileOutputStream out = new FileOutputStream(destFile); // 输出到文件流
            out.write(data);
            out.close();
            // 此处一定要使用org.apache.tomcat.util.codec.binary.Base64,防止再linux上出现换行等特殊符号
            base64Image = Base64.encodeBase64String(data);
        } catch (Exception e) {
            // 抛出异常
            throw e;
        } finally {
            if (dataInputStream != null) {
                try {
                    dataInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return base64Image;
    }

}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值