精华内容
下载资源
问答
  • 主要为大家详细介绍了使用Thumbnails实现图片指定大小压缩,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • java使用Thumbnails压缩图片 有时候为了缓解服务器上的存储压力,我们需要将图片进行压缩以换取空间。 下面使用的是google提供的压缩方式: 一、导包 <!-- 压缩图片大小 --> <dependency> <groupId&...

    java使用Thumbnails压缩图片

    有时候为了缓解服务器上的存储压力,我们需要将图片进行压缩以换取空间。
    下面使用的是google提供的压缩方式:

    一、导包

    <!-- 压缩图片大小 -->
    <dependency>
        <groupId>net.coobird</groupId>
        <artifactId>thumbnailator</artifactId>
        <version>0.4.8</version>
    </dependency>
    

    二、使用

    1.下面是工具类:

    /**
    * @Anthor zyl
    * 压缩图片大小
    * oldPath -- 原地址
    * newPath -- 新地址
    * scale -- 指定图片的大小,值在0到1之间,1f就是原图大小,0.5就是原图的一半大小,这里的大小是指图片的长宽。
    * quality -- 图片的质量,值也是在0到1,越接近于1质量越好,越接近于0质量越差。
    * @Date 2021/4/26
    **/
    public static void compressSize(String oldPath, String newPath, float scale, float quality) {
        try {
            Thumbnails.of(oldPath)
                    .scale(scale)
                    .outputQuality(quality)
                    .toFile(newPath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    2.调用

    FileUtil.compressSize(imagePath, imagePath, 1f, 0.1f);
    

    三、总结

    使用方式比较简单,只需要在scale 和 quality选取你认为最合适的值就可以了。

    展开全文
  • easy_thumbnails:A powerful, yet easy to implement thumbnailing application for Django 1.4+ 安装 pip install easy_thumbanils 在你的项目中配置 ...在Django中压缩 setting.py 首先,setting中添
  • Thumbnails 压缩图片到指定kb

    千次阅读 2020-07-01 13:33:33
    -- google图片处理 --> <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.11</version> </dependency>...

    要求:

    1.代码简单,运行效率高

    2.图片不失真(压缩后依然清晰)

    3.能压缩到指定kb值(允许尺寸按参数值缩小)

    呵呵:一张3M的图片,要求不缩小宽高 、要求不失真!!! 还想压缩到比较小kb值(比如100kb) ;别往下看了。

     

    下文能达到的:
    允许按比例缩小宽高,如果达不到100kb,允许图片稍微模糊。

     

    添加依赖:

    <!-- google图片处理 -->
    <dependency>
    	    <groupId>net.coobird</groupId>
    	    <artifactId>thumbnailator</artifactId>
    	    <version>0.4.11</version>
    </dependency>

    代码

    package com.solar.oa.card.util;
    
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.math.BigDecimal;
    import javax.imageio.ImageIO;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import net.coobird.thumbnailator.Thumbnails;
    
    /**
     * 图片处理
     * @ClassName: ImageUtil.java
     * @Description: TODO 
     * @date 2020年6月30日 下午2:24:55
     * @author yqwang
     */
    public class ImageUtil {
        private final static Logger logger = LoggerFactory.getLogger(ImageUtil.class);
    
        /**
         * 【压缩图片】到要求的图片标准:  宽[300,500],高[300,500];100kb;jpg/jpeg
         * 先按宽高压缩,压缩后如果还不满足100kb,则按质量递归压缩
         * @Title:compressPhoto
         * @Description: TODO 
         * @date 2020年6月30日 下午2:11:52
         * @author yqwang
         * @param imgFile 源图片文件
         * @param maxkb 目标kb
         * @param photoWidth 目标宽度
         * @param photoHeight 模板高度
         * @param quality 质量
         * @return 处理后的文件byte[]
         * @throws Exception
         */
        public static byte[] compressPhoto(File imgFile,Integer maxkb,Integer photoWidth,Integer photoHeight,Float quality) throws Exception{
            // 1.压缩图片是否存在
            if(imgFile == null || !imgFile.exists()){
                throw new Exception("图片文件不存在。");
            }
            byte[] bytes = readFileToByteArray(imgFile);
            if(bytes == null || bytes.length == 0){
                throw new Exception("图片文件为空。");
            }
            
            // 2.是否超过100kb?没超过就不处理图片
            long fileSize = bytes.length;
            if (fileSize <= maxkb * 1024) {
                logger.info("图片不超过{}kb,无需压缩。",maxkb);
                return bytes;
            }
            
            // 3.压缩到300-500宽高,100kb
            BufferedImage bim = ImageIO.read(new ByteArrayInputStream(bytes));
            int imgWidth = bim.getWidth();
            int imgHeight = bim.getHeight();
            
            // 3.1.先按宽高判断是否需要缩放  outputQuality=1确保画质清晰
            if(imgWidth >= photoWidth && imgHeight >= photoHeight){
                logger.info("先按宽{}高{}压缩。",photoWidth,photoHeight);
                ByteArrayOutputStream out = new ByteArrayOutputStream();//Closing a <tt>ByteArrayOutputStream</tt> has no effect.   因此无需close
                Thumbnails.of(new ByteArrayInputStream(bytes)).size(photoWidth, photoHeight).outputQuality(1).outputFormat("jpg").toOutputStream(out);
                bytes = out.toByteArray();
            }
            // 3.2.判断按宽高缩放后是否超过100kb,超过递归就按质量压缩(图片会变得越来越模糊!)
            bytes = compressPhotoByQuality(bytes, quality, maxkb);
            return bytes;
        }
       
        /**
         * 递归按quality质量处理,压缩到maxkb后返回新的bytes值
         * @Title:compressPhotoByQuality
         * @Description: TODO 
         * @date 2020年6月30日 下午2:24:36
         * @author yqwang
         * @param bytes 源文件字节
         * @param quality 压缩质量 (如果>=1则不处理)
         * @param maxkb 要求压缩到的最大kb
         * @return
         * @throws IOException
         */
        public static byte[] compressPhotoByQuality(byte[] bytes,Float quality,long maxkb) throws IOException{
            if(bytes == null){
                return bytes;
            }
            logger.info("开始按质量压缩图片({}kb)。",bytes.length/1024);
            // 如果配置的>=1,则不再处理,多说无益
            if(quality >= 1){
                logger.info("quality>=1,不执行压缩。");
                return bytes;
            }
            // 满足目标kb值,则返回
            long fileSize = bytes.length;
            if (fileSize <= maxkb * 1024) {
                logger.info("图片文件{}kb<={}kb,不再压缩质量。",fileSize/1024,maxkb);
                return bytes;
            }
            // Closing a <tt>ByteArrayOutputStream</tt> has no effect.   因此无需close
            ByteArrayOutputStream out = null;
            out = new ByteArrayOutputStream();
            BufferedImage bim = ImageIO.read(new ByteArrayInputStream(bytes));
            int imgWidth = bim.getWidth();
            int imgHeight = bim.getHeight();
            // 如果不处理size,只用quality,可能导致一致压缩不到目标值,一致递归在当前方法中!!
            int desWidth = new BigDecimal(imgWidth).multiply(new BigDecimal(quality)).intValue();
            int desHeight = new BigDecimal(imgHeight).multiply(new BigDecimal(quality)).intValue();
            logger.info("图片文将按照width={}*height={}进行压缩,画质quality={}。",desWidth,desHeight,quality);
            Thumbnails.of(new ByteArrayInputStream(bytes)).size(desWidth, desHeight).outputQuality(quality).outputFormat("jpg").toOutputStream(out);
            //递归
            return compressPhotoByQuality(out.toByteArray(), quality, maxkb);
        }
        
        /**File to bytes[]*/
        public static byte[] readFileToByteArray(File f) throws Exception {
            byte[] fileb = null;
            InputStream is = null;
            ByteArrayOutputStream out = new ByteArrayOutputStream();
    
            try {
                is = new FileInputStream(f);
                byte[] b = new byte[1024];
    
                int n;
                while ((n = is.read(b)) != -1) {
                    out.write(b, 0, n);
                }
    
                fileb = out.toByteArray();
                return fileb;
            } catch (Exception var16) {
                throw new Exception("readFileToByteArray", var16);
            } finally {
                if (is != null) {
                    try {
                        is.close();
                    } catch (Exception var15) {
                        ;
                    }
                }
    
                if (out != null) {
                    try {
                        out.close();
                    } catch (Exception var14) {
                        ;
                    }
                }
    
            }
        }
    }
    

     测试

    package com.solar.oa.card.util;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import org.apache.commons.codec.binary.Base64;
    
    public class ImageTest {
        public static void main(String[] args) throws Exception {
            
            // 图片压缩
            File file = new File("D://test/1.jpg");
            /*@Parameters:imgFile 源图片文件;maxkb 目标kb;photoWidth 目标宽度;photoHeight 模板高度;quality 质量*/
            byte[] bytes = ImageUtil.compressPhoto(file, 100, 300, 300, 0.9f);
            
            
            // 输出到文件
            File desFile = new File("D://test/2.jpg"); 
            FileOutputStream fos = new FileOutputStream(desFile);
            fos.write(bytes);
            fos.close();
            
            // 转base64
            System.out.println("data:image/jpg;base64,"+ Base64.encodeBase64String(bytes));
        }
    }
    

    效果:1.86MB-->58kb,且压缩后图片依然清晰!

    source.jpg: 2708x3085  1.86MB

    result.jpg:263x300  58kb

    result:

    展开全文
  • Thumbnails压缩图片

    2019-02-14 17:09:22
    -- 压缩图片工具包 --&gt; &lt;dependency&gt; &lt;groupId&gt;net.coobird&lt;/groupId&gt; &lt;artifactId&gt;thumbnailator&lt;/artifactId&gt; &lt;...

    引入jar包

    	<!-- 压缩图片工具包 -->
    	<dependency>
    		<groupId>net.coobird</groupId>
    		<artifactId>thumbnailator</artifactId>
    		<version>0.4.8</version>
    	</dependency>
    

    使用:

    	/**
    	 * 附件上传  --2018.10.19
    	 * @param request
    	 * @param response
    	 * @return
    	 */
    	@RequestMapping(params = "doAddAttachment")
    	@ResponseBody
    	public AjaxJson doAddAttachment(HttpServletRequest request,HttpServletResponse response) {
    		System.out.println("附件上传");
    		String idd = request.getParameter("idd");
    		System.out.println("33idd:" + idd);
    		String separator = File.separator;
    		String message = null;
    		String attPath = bundle.getString("attPath");
    		SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");	
    		HttpSession session = request.getSession();
    		String picType = (String)session.getAttribute("picType");
    		System.out.println("picType:" + picType);
    		//request.getSession().removeAttribute("picType");
    		AjaxJson j = new AjaxJson();
    		message = "附件上传成功";
    		if ("00".equals(picType) || StringUtils.isBlank(picType)) {
    			System.out.println("情况1");
    			message = "请选择图片类型";
    		} else {
    			System.out.println("情况2");
    			try {
    				MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
    				Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
    				for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
    					MultipartFile file = entity.getValue();// 获取上传文件对象
    					String attName = file.getOriginalFilename();
    					System.out.println("文件名:" + file.getOriginalFilename());
    
    					// 路径 示例:F:\out-put\attachment\20180914\idd\附件名
    					String subPath = separator + df.format(new Date()) + separator + idd;
    					String finalPath = attPath + subPath;
    					File files = new File(finalPath);
    
    					if (files.exists()) {
    						if (files.isDirectory()) {
    							logger.info("dir exists---文件夹已存在");
    						} else {
    							logger.info("the same name file exists, can not create dir");
    						}
    					} else {
    						logger.info("dir not exists, create it ...");
    						files.mkdirs();
    					}
    
    					File files2 = new File(finalPath + separator + attName);
    
    					long size = file.getSize() / 1024;// 获取文件大小,单位kb
    					System.out.println("图片大小:" + size);
    
    					if (size > 2000) {// 图片大于200k进行压缩处理
    						System.out.println("图片过大,压缩处理");
    						// 压缩并保存图片,图片缩放80%, 图片质量压缩60%
    						Thumbnails.of(file.getInputStream()).scale(0.8).outputQuality(0.6).toFile(files2);
    					} else {
    						System.out.println("不压缩");
    						file.transferTo(new File(finalPath + separator + attName));// 保存到目录下
    					}
    
    					ContractAttachmentEntity att = new ContractAttachmentEntity();
    					att.setContractManagementId(idd);
    					att.setAttachmentName(file.getOriginalFilename());
    					att.setCreateBy(ResourceUtil.getSessionUser().getUserName());
    					att.setCreateTime(new Date());
    					att.setPath(finalPath + separator + attName);
    					att.setStatus("0");
    					att.setPicType(picType);
    					contractAttachmentService.save(att);
    				}
    			} catch (Exception e) {
    				message = "附件上传失败";
    				e.printStackTrace();
    				logger.info(e.getMessage(),e);
    
    			}
    		}
    
    		j.setMsg(message);
    		return j;
    	}
    
    展开全文
  • Java使用 Thumbnails 压缩图片

    千次阅读 2020-06-04 15:55:21
    处理缩略图并上传:拿到MultipartFile压缩成缩略图后存放到项目内指定文件夹 用项目内新生成的缩略图转换为MultipartFile发送给图片上传方法得到url 流程处理完后删除存放在项目内的缩略图 public ...

    业务:用户上传一张图片到文件站,需要返回原图url和缩略图url


    处理思路:

    1. 因为上传图片方法返回url是单个上传,第一步先上传原图并返回url

    2. 处理缩略图并上传:拿到MultipartFile压缩成缩略图后存放到项目内指定文件夹

    3. 用项目内新生成的缩略图转换为MultipartFile发送给图片上传方法得到url

    4. 流程处理完后删除存放在项目内的缩略图

        public void imageMethod(MultipartFile file){
    
            //region/-------创建缩略图存放的文件夹-------/
            //获得项目根目录
            String path = System.getProperty("user.dir");
            //定义新文件夹路径
            String dirPath = path + File.separator + "imagecache";
            //根据路径生成文件夹
            File dir = new File(dirPath);
            dir.mkdirs();
            //endregion
    
            //定义缩略图的全路径
            String fileSuffix = "image.jpg";
            String contextPath = dirPath + File.separator + fileSuffix;
    
            //压缩图片
            MultipartFile newFile = null;
            try {
                //自定义宽高压缩(压缩方法很多,可以根据需求更改)
                Thumbnails.of(file.getInputStream()).forceSize(100, 100).toFile(contextPath);
    
                //压缩完成后将缩略图生成MultipartFile
                FileItem fileItem = createFileItem(contextPath);
                newFile = new CommonsMultipartFile(fileItem);
    
            } catch (IOException e) {
                e.printStackTrace();
            }
            //endregion
    
            //上面的“newFile”就是缩略图转换后的MultipartFile,就可以拿来用了
    
            //程序处理完后把生成的缩略图删除
            File image = new File(contextPath);
            if (image.exists()) {
                image.delete();
            }
    
        }
    
    
    
        /**
         * 获取压缩后的图片,File 转为 MultipartFile
         *
         */
        public FileItem createFileItem(String contextPath) {
            {
                FileItemFactory factory = new DiskFileItemFactory(16, null);
                String textFieldName = "textField";
                int num = contextPath.lastIndexOf(".");
                String extFile = contextPath.substring(num);
                FileItem item = factory.createItem(textFieldName, "text/plain", true,
                        "MyFileName" + extFile);
                File newfile = new File(contextPath);
                int bytesRead = 0;
                byte[] buffer = new byte[8192];
                try {
                    FileInputStream fis = new FileInputStream(newfile);
                    OutputStream os = item.getOutputStream();
                    while ((bytesRead = fis.read(buffer, 0, 8192))
                            != -1) {
                        os.write(buffer, 0, bytesRead);
                    }
                    os.close();
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return item;
            }
        }

     

    展开全文
  • 使用Thumbnails压缩图片 <!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator 压缩图片插件--> <dependency> <groupId>net.coobird</groupId> <artifactId>...
  • 使用 Thumbnails 压缩图片

    千次阅读 2018-07-26 15:27:27
    PC上线的商城,最近推出了手机版(App &amp;...所以就查了一下图片压缩的资料;然后看到了Google开源 项目Thumbnails;用了一下发现效果挺不错;代码比价简单 Thumbnails.of("源文件路径...
  • // 压缩代码 //防止图片变红 Image src = Toolkit.getDefaultToolkit().getImage(filePath); BufferedImage image = toBufferedImage(src); Thumbnails.of(image).scale(1f).toFile(filePath); // log.error("压缩...
  • Thumbnails压缩图片到指定大小

    千次阅读 2019-09-30 09:55:58
    网上看了很多demo,很多都是照搬别人的代码,不管有没有问题,有的甚至递归不关流,还有... * @Description: 压缩图片到指定大小 * @Param: desFileSize:大小,accuracy:每次缩小几倍 * @return: String * @A...
  • 使用Thumbnails压缩图片

    千次阅读 2017-11-28 16:05:51
    -- 压缩图片jar --> < dependency > < groupId > net.coobird groupId > < artifactId > thumbnailator artifactId > < version > 0.4.8 version > dependency > 详细代码 前端使用...
  • public String compressToBASE64(InputStream inputStream){ ... Thumbnails.of(inputStream) .scale(1) .outputQuality(0.5f) .toOutputStream(new ByteArrayOutputStream()); return Base64.getEncoder()
  • java通过Thumbnails压缩图片

    千次阅读 2019-03-06 09:59:10
    一, 图片压缩处理 需求: 图片上传时太大, 要求压缩至xx ... * 根据指定大小压缩图片 * * @param imageBytes * 源图片字节数组 * @param desFileSize * 指定图片大小,单位kb * @param imageId * 影...
  • 问题现象 首先用户反映,有数据不一致情况产生,为了查询什么原因导致的数据不一致问题, 扒拉出来日志看了一通,发现有个简单的查询耗时特别长,平时只要几ms返回结果的 确调用了200多s,查了各个服务的日志,发现...
  • 为了解决这个问题,我也是在网上找了好久,看了很多资料,功夫不负有心人,最终找到了一个处理图片十分棒的开源框架。特此拿出来与大家分享。  简介:图片处理是当今软件开发中非常重要的一环,然而处理图片的开.....
  • importio.swagger.annotations.Api;importio.swagger.annotations.ApiOperation;importlombok.extern.slf4j.Slf...importnet.coobird.thumbnailator.Thumbnails;importorg.apache.commons.io.FileUtils;importorg.sp...
  • Thumbnails 压缩图片(缩放图片,编辑,格式转化,流处理) maven <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.8...
  • 使用Thumbnails插件实现对图片压缩、裁剪、旋转、水印等。 导入项目后修改图片地址和输出图片地址,运行main方法即可看到效果。
  • Thumbnails图片压缩 这个很早之前就发在协会的博客园里了,链接在此Thumbnails图片压缩 每次上传图片到服务器的时候,都会由于图片过大导致加载很长时间,然后就想使用图片压缩可以稍微减轻一点图片处理的压力 用...
  • 首先看下缩放图片的核心代码,其实只有一行...Thumbnails.of(ins).scale(0.99f).toOutputStream(out); 整体代码: 为了方便起见,我把整个代码全拿过来了,防止导错包,所以使用的话直接复制即可使用 说明我这里压缩
  • 如何使用Thumbnails等比例压缩图片我是用MultipartFile来接收文件的具体思路直接上代码 我是用MultipartFile来接收文件的 我的后台接受参数使用的是MultipartFile来接收文件的字段名为cover 具体思路 一开始我是根据...
  • public static String compressToBASE64(MultipartFile file) throws IOException { BASE64Encoder base64... //存放图片转码后的数据 String base64EncoderImg = ""; try { ByteArrayOutputStream out = ne...
  • 主要介绍了解决java压缩图片透明背景变黑色的问题,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,578
精华内容 1,031
关键字:

thumbnails压缩图片问题