java图片压缩(Thumbnails)

package com.hzxc.groupactivity.server.util;
import java.awt.image.BufferedImage;
import java.io.*;
import java.math.BigDecimal;

import javax.imageio.ImageIO;
import net.coobird.thumbnailator.Thumbnails;
import org.apache.commons.lang3.StringUtils;

/**
 * Created by hdwang on 2018/12/13.
 */
public class PicUtils {

    public static void main(String[] args) {

        PicUtils.commpressPicForScale("/Users/hdwang/Downloads/1.jpg","/Users/hdwang/Downloads/1_s.jpg", 1000, 0.8,750,1334); // 图片小于1000kb

    }

    /**
      * 根据指定大小和指定精度压缩图片
      *
      * @param srcPath
      *            源图片地址
      * @param desPath
      *            目标图片地址
      * @param desFileSize
      *            指定图片大小,单位kb
      * @param accuracy
      *            精度,递归压缩的比率,建议小于0.9
     *  @param desMaxWidth
     *             目标最大宽度
     *  @param desMaxHeight
     *             目标最大高度
      * @return 目标文件路径
      */
    public static String commpressPicForScale(String srcPath, String desPath,
            long desFileSize, double accuracy,int desMaxWidth,int desMaxHeight) {
        if (StringUtils.isEmpty(srcPath) || StringUtils.isEmpty(srcPath)) {
            return null;
        }
        if (!new File(srcPath).exists()) {
            return null;
        }
        try {
            File srcFile = new File(srcPath);
            long srcFileSize = srcFile.length();
            System.out.println("源图片:" + srcPath + ",大小:" + srcFileSize / 1024
                                        + "kb");
            //获取图片信息
            BufferedImage bim = ImageIO.read(srcFile);
            int srcWidth = bim.getWidth();
            int srcHeight = bim.getHeight();

            //先转换成jpg
            Thumbnails.Builder builder = Thumbnails.of(srcFile).outputFormat("jpg");

            // 指定大小(宽或高超出会才会被缩放)
            if(srcWidth > desMaxWidth || srcHeight > desMaxHeight) {
                builder.size(desMaxWidth, desMaxHeight);
            }else{
                //宽高均小,指定原大小
                builder.size(srcWidth,srcHeight);
            }

            // 写入到内存
            ByteArrayOutputStream baos = new ByteArrayOutputStream(); //字节输出流(写入到内存)
            builder.toOutputStream(baos);

            // 递归压缩,直到目标文件大小小于desFileSize
            byte[] bytes = commpressPicCycle(baos.toByteArray(), desFileSize, accuracy);

            // 输出到文件
            File desFile = new File(desPath);
            FileOutputStream fos = new FileOutputStream(desFile);
            fos.write(bytes);

            System.out.println("目标图片:" + desPath + ",大小" + desFile.length() / 1024 + "kb");
            System.out.println("图片压缩完成!");
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return desPath;
    }

    private static byte[] commpressPicCycle(byte[] bytes, long desFileSize, double accuracy) throws IOException {
       // File srcFileJPG = new File(desPath);
        long srcFileSizeJPG = bytes.length;
        // 2、判断大小,如果小于500kb,不压缩;如果大于等于500kb,压缩
        if (srcFileSizeJPG <= desFileSize * 1024) {
            return bytes;
        }
        // 计算宽高
        BufferedImage bim = ImageIO.read(new ByteArrayInputStream(bytes));
        int srcWdith = bim.getWidth();
        int srcHeigth = bim.getHeight();
        int desWidth = new BigDecimal(srcWdith).multiply(
                                new BigDecimal(accuracy)).intValue();
        int desHeight = new BigDecimal(srcHeigth).multiply(
                                new BigDecimal(accuracy)).intValue();

        ByteArrayOutputStream baos = new ByteArrayOutputStream(); //字节输出流(写入到内存)
        Thumbnails.of(new ByteArrayInputStream(bytes)).size(desWidth, desHeight).outputQuality(accuracy).toOutputStream(baos);
        return commpressPicCycle(baos.toByteArray(), desFileSize, accuracy);
    }

}

参考文章:

https://blog.csdn.net/qiaqia609/article/details/53171149

https://blog.csdn.net/qiaqia609/article/details/53171149

原文地址:https://www.cnblogs.com/hdwang/p/10118028.html

时间: 2024-10-10 20:01:43

java图片压缩(Thumbnails)的相关文章

java 图片压缩变色问题

java图片压缩,有时由于图片自身的原因,如透明的PNG图.改alpha通道或四色图等. 压缩完了,会出现图片变色的情况. 如: 原图 压缩完: 尝试了很多方法,如JDK原生的方式及第三方组件java-image-scaling或thumbnailator都不解决问题. 后来采用阿里的SimpleImage解决.记录一下 SimpleImage github地址:https://github.com/alibaba/simpleimage依赖jar:commons-io-2.4.jarcommo

java图片压缩,使用ImageIO代替JPEGImageEncoder

最近做项目需要图片压缩处理,网上找的方法大都使用了 com.sun.image.codec.jpeg.* 这个包中的JPEGImageEncoder类,引入这个包后一直报错,各种google百度,尝试了各种方法,包括手动引jre中的rt.jar,以及在eclipse中把受访问限制的API提示从ERROR改为WARNING,等等,然而这些都是不好使的,因为后来我发现我的java-7-openjdk-amd64中的rt.jar里边根本就没有com.sun.image.*,貌似这个类在java7中已经

java图片压缩

使用java对图片进行缩放, pom依赖 <!-- 照片处理 --> <dependency> <groupId>com.mortennobel</groupId> <artifactId>java-image-scaling</artifactId> <version>0.8.6</version> </dependency> java范例代码 package com.mypackage; imp

java图片压缩策略说明

使用java原生或者使用第三方的jar来生成. 存在的问题: 原生效率慢,并且和代码耦合性太高,支持格式少,其他没太多尝试 使用thumbnailator.jar 第三方.效率不高,压缩完的图片质量太低.支持格式少,如果原本图片的后缀为.jpg的改成.png之后,无法支持操作..png的图片保存时为透明时候,压缩出来的图片会出现颜色严重失调的问题.和代码的耦合性太高 以上这两个和代码的耦合性太高,因此如何存在项目群时,图片的处理会变的和无力. 2.因此我推荐使用以下的解决方案:由nginx来处理

[Java]图片压缩

Java中内置的压缩图片有两种方式: 通过Image的getScaledInstance方法将图片尺寸进行压缩,它的压缩策略有: SCALE_DEFAULT 默认图像缩放算法 SCALE_FAST 缩放速度优先 SCALE_SMOOTH 图像平滑度优先 它的优点是可以在尽量不影响图像质量的情况下对图片进行一定的压缩,缺点是压缩的效果有局限性. 使用ImageWriteParam的setCompressionQuality方法设置ImageWrite输出图片时生成的图片质量,它的优点是可以在不改变

Java图片处理 Thumbnails框架

一.设置图片的缩放比例或者图片的质量比 第一步:导入maven的jar包 <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.8</version> </dependency> 第二步:获取一个Builder<File>对象 public static Buil

一:Java使用google的thumbnailator工具对图片压缩水印等做处理

Thumbnailator是一个非常好的图片开源工具 使用方法: 在pom中加入以下jar包 <!-- 图片缩略图 图片压缩 水印 start--> <dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version></dependency><!-- 图

图片压缩java工具类

package com.net.util; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import org

Java后端实现图片压缩技术

今天来说说图片压缩技术,为什么要使用图片压缩,图片上传不就完事了吗?对的,这在几年前可以这么说,因为几年前还没有现在这么大的并发,也没有现在这么关注性能. 如今手机很多,很多人都是通过手机访问网络或者app,再调用接口的时候肯定会多多少少的浏览图片,尤其是脱离wifi的情况下,可以看到很多软件展示都会展示小图,这个小图就是压缩的图片,点击后才会放大,如下: 这样的做法可以尽量减少手机端的图片展示压力,因为一个图片对于上传者来说可能是几百K,也有可能是几兆,这样对于手机端无遗展现的压力会比较大,同