互联网图片压缩、下载——java实现

最近遇到一个问题,要求是在把一张存在于网络上的图片进行下载和压缩。

解决思路:

1、获取图片的输入流
2、得到图片的字节流
3、使用google的thumbnailator.jar对字节流进行压缩
4、把压缩后的字节流重新转换为输入流
5、设置下载地址,下载到本地或ftp服务器

实现

这里只介绍下载到本地的具体实现方式
我才用的是Spring boot + maven搭建的测试项目
首先要引入google的thumbnailator的引用

<dependency>
      <groupId>net.coobird</groupId>
      <artifactId>thumbnailator</artifactId>
      <version>0.4.8</version>
    </dependency>

构建图片压缩转换的工具类

import net.coobird.thumbnailator.Thumbnails;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;

/**
 * 文件处理工具类
 * 
 */
public class UploadUtils {
    
    /**
     * 从输入流中获取数据
     * @param inStream
     * @return
     * @throws Exception
     */
    public static byte[] readInputStream(InputStream inStream) throws Exception {
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = inStream.read(buffer)) != -1) {
            outStream.write(buffer, 0, len);
        }
        inStream.close();
        return outStream.toByteArray();
    }

    /**
     * 根据指定大小压缩图片
     *
     * @param imageBytes  源图片字节数组
     * @param desFileSize 指定图片大小,单位kb
     * @return 压缩质量后的图片字节数组
     */
    public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize) {
        if (imageBytes == null || imageBytes.length <= 0 || imageBytes.length < desFileSize * 1024) {
            return imageBytes;
        }
        long srcSize = imageBytes.length;
        double accuracy = getAccuracy(srcSize / 1024);
        try {
            while (imageBytes.length > desFileSize * 1024) {
                ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
                Thumbnails.of(inputStream)
                        .scale(accuracy)
                        .outputQuality(accuracy)
                        .toOutputStream(outputStream);
                imageBytes = outputStream.toByteArray();
            }
            System.out.println("【图片压缩】| 图片原大小={" + srcSize / 1024 + "}kb | 压缩后大小={" + imageBytes.length / 1024 + "}kb | ");
        } catch (Exception e) {
            System.out.println("【图片压缩】msg=图片压缩失败!" + e);
        }
        return imageBytes;
    }

    /**
     * 自动调节精度(经验数值)
     *
     * @param size 源图片大小
     * @return 图片压缩质量比
     */
    private static double getAccuracy(long size) {
        double accuracy;
        if (size < 900) {
            accuracy = 0.85;
        } else if (size < 2047) {
            accuracy = 0.6;
        } else if (size < 3275) {
            accuracy = 0.44;
        } else {
            accuracy = 0.4;
        }
        return accuracy;
    }
}

编写测试方法

public static void main(String[] args) throws Exception {
        //这里同样用File获取一下文件,便于拿到文件的名称、类型等信息
        File file = new File(imageUrl);
        //http://xxx/xxx/xxx.png(jpg等等)
        URL url = new URL("完整图片地址");
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        conn.setRequestMethod("GET");
        //通过输入流获取图片数据
        InputStream urlInputStream = conn.getInputStream();
        //获取图片的字节流
        byte[] imgBytes = readInputStream(urlInputStream);
        //压缩图片
        byte[] minImgBytes = compressPicForScale(imgBytes, 40);
        //将压缩后的字节流转换为输入流
        InputStream inputStream = new ByteArrayInputStream(minImgBytes);
        //获取图片字节流并写入磁盘
        outputStreamFile(readInputStream(inputStream), "20190426095107749847010.png");
        //上传文件到ftp(FTPUtils:自定义ftp工具类)
        //String uploadFilePath = FTPUtils.uploadFile("20190426095107749847010.png", filePath, inputStream);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 延时执行 到目前为止,我们所运行的命令都是立即执行的。也就是我们按下回车键的那一刻,命令就开始执行了。 其实,在L...
    Zoulf阅读 1,610评论 0 1
  • 文/稻草人 三月的樱花,正美 我不愿,与樱花作伴 这承诺太年轻,无处安放我青春里的痴狂 我愿以风为马,路过那一片金...
    疯狂稻草人阅读 236评论 0 0
  • 早上某网首页看到这样标题某某明星孩子照曝光,长相雷人! 能对孩子口下留情么?如果有人说你孩子长得跟个傻子你做何感想?
    岸兰汀芷阅读 201评论 0 0
  • Superset_安装指南 参考文档 http://blog.csdn.net/qq273681448/artic...
    剑御阅读 1,627评论 0 2