java实现上传图片并压缩图片大小功能
程序员文章站
2024-02-21 21:55:52
thumbnailator 是一个优秀的图片处理的google开源java类库。处理效果远比java api的好。从api提供现有的图像文件和图像对象的类中简化了处理过程,...
thumbnailator 是一个优秀的图片处理的google开源java类库。处理效果远比java api的好。从api提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式,同时保持了需要写入的最低限度的代码量。还支持对一个目录的所有图片进行批量处理操作。
支持的处理操作:图片缩放,区域裁剪,水印,旋转,保持比例。
另外值得一提的是,thumbnailator至今仍不断更新,怎么样,感觉很有保障吧!
下面我们介绍下如何使用thumbnailator
使用介绍地址:
利用thumbnailator轻松实现图片缩放、旋转与加水印
缩略图压缩文件jar包
<!-- 图片缩略图 --> <dependency> <groupid>net.coobird</groupid> <artifactid>thumbnailator</artifactid> <version>0.4.8</version> </dependency>
按指定大小把图片进行缩放(会遵循原图高宽比例)
//按指定大小把图片进行缩和放(会遵循原图高宽比例) //此处把图片压成400×500的缩略图 thumbnails.of(frompic).size(400,500).tofile(topic); //变为400*300,遵循原图比例缩或放到400*某个高度
按照指定比例进行缩小和放大
//按照比例进行缩小和放大 thumbnails.of(frompic).scale(0.2f).tofile(topic);//按比例缩小 thumbnails.of(frompic).scale(2f);//按比例放大
图片尺寸不变,压缩图片文件大小
//图片尺寸不变,压缩图片文件大小outputquality实现,参数1为最高质量 thumbnails.of(frompic).scale(1f).outputquality(0.25f).tofile(topic);
我这里只使用了 图片尺寸不变,压缩文件大小 源码
/** * * @description:保存图片并且生成缩略图 * @param imagefile 图片文件 * @param request 请求对象 * @param uploadpath 上传目录 * @return */ public static baseresult uploadfileandcreatethumbnail(multipartfile imagefile,httpservletrequest request,string uploadpath) { if(imagefile == null ){ return new baseresult(false, "imagefile不能为空"); } if (imagefile.getsize() >= 10*1024*1024) { return new baseresult(false, "文件不能大于10m"); } string uuid = uuid.randomuuid().tostring(); string filedirectory = commondateutils.date2string(new date(), commondateutils.yyyy_mm_dd); //拼接后台文件名称 string pathname = filedirectory + file.separator + uuid + "." + filenameutils.getextension(imagefile.getoriginalfilename()); //构建保存文件路劲 //2016-5-6 yangkang 修改上传路径为服务器上 string realpath = request.getservletcontext().getrealpath("uploadpath"); //获取服务器绝对路径 linux 服务器地址 获取当前使用的配置文件配置 //string urlstring=propertiesutil.getinstance().getsyspro("uploadpath"); //拼接文件路劲 string filepathname = realpath + file.separator + pathname; log.info("图片上传路径:"+filepathname); //判断文件保存是否存在 file file = new file(filepathname); if (file.getparentfile() != null || !file.getparentfile().isdirectory()) { //创建文件 file.getparentfile().mkdirs(); } inputstream inputstream = null; fileoutputstream fileoutputstream = null; try { inputstream = imagefile.getinputstream(); fileoutputstream = new fileoutputstream(file); //写出文件 //2016-05-12 yangkang 改为增加缓存 // ioutils.copy(inputstream, fileoutputstream); byte[] buffer = new byte[2048]; ioutils.copylarge(inputstream, fileoutputstream, buffer); buffer = null; } catch (ioexception e) { filepathname = null; return new baseresult(false, "操作失败", e.getmessage()); } finally { try { if (inputstream != null) { inputstream.close(); } if (fileoutputstream != null) { fileoutputstream.flush(); fileoutputstream.close(); } } catch (ioexception e) { filepathname = null; return new baseresult(false, "操作失败", e.getmessage()); } } // string fileid = fastdfsclient.uploadfile(file, filepathname); /** * 缩略图begin */ //拼接后台文件名称 string thumbnailpathname = filedirectory + file.separator + uuid + "small." + filenameutils.getextension(imagefile.getoriginalfilename()); //added by yangkang 2016-3-30 去掉后缀中包含的.png字符串 if(thumbnailpathname.contains(".png")){ thumbnailpathname = thumbnailpathname.replace(".png", ".jpg"); } long size = imagefile.getsize(); double scale = 1.0d ; if(size >= 200*1024){ if(size > 0){ scale = (200*1024f) / size ; } } //拼接文件路劲 string thumbnailfilepathname = realpath + file.separator + thumbnailpathname; try { //added by chenshun 2016-3-22 注释掉之前长宽的方式,改用大小 // thumbnails.of(filepathname).size(width, height).tofile(thumbnailfilepathname); if(size < 200*1024){ thumbnails.of(filepathname).scale(1f).outputformat("jpg").tofile(thumbnailfilepathname); }else{ thumbnails.of(filepathname).scale(1f).outputquality(scale).outputformat("jpg").tofile(thumbnailfilepathname); } } catch (exception e1) { return new baseresult(false, "操作失败", e1.getmessage()); } /** * 缩略图end */ map<string, object> map = new hashmap<string, object>(); //原图地址 map.put("originalurl", pathname); //缩略图地址 map.put("thumbnailurl", thumbnailpathname); return new baseresult(true, "操作成功", map); }
获取当前使用的配置文件信息
/** * 根据key从gzt.properties配置文件获取配置信息 * @param key 键值 * @return */ public string getsyspro(string key){ return getsyspro(key, null); } /** * 根据key从gzt.properties配置文件获取配置信息 * @param key 键值 * @param defaultvalue 默认值 * @return */ public string getsyspro(string key,string defaultvalue){ return getvalue("spring/imageserver-"+system.getproperty("spring.profiles.active")+".properties", key, defaultvalue); }
例:
//获取服务器绝对路径 linux 服务器地址 string urlstring=propertiesutil.getinstance().getsyspro("uploadpath");
propertiesutil 类
package com.xyz.imageserver.common.properties; import org.slf4j.logger; import org.slf4j.loggerfactory; import java.io.ioexception; import java.io.inputstream; import java.io.inputstreamreader; import java.util.properties; import java.util.concurrent.concurrenthashmap; /** * * @classname propertiesutil.java * @description 系统配置工具类 * @author caijy * @date 2015年6月9日 上午10:50:38 * @version 1.0.0 */ public class propertiesutil { private logger logger = loggerfactory.getlogger(propertiesutil.class); private concurrenthashmap<string, properties> promap; private propertiesutil() { promap = new concurrenthashmap<string, properties>(); } private static propertiesutil instance = new propertiesutil(); /** * 获取单例对象 * @return */ public static propertiesutil getinstance() { return instance; } /** * 根据key从gzt.properties配置文件获取配置信息 * @param key 键值 * @return */ public string getsyspro(string key){ return getsyspro(key, null); } /** * 根据key从gzt.properties配置文件获取配置信息 * @param key 键值 * @param defaultvalue 默认值 * @return */ public string getsyspro(string key,string defaultvalue){ return getvalue("spring/imageserver-"+system.getproperty("spring.profiles.active")+".properties", key, defaultvalue); } /** * 从配置文件中获取对应key值 * @param filename 配置文件名 * @param key key值 * @param defaultvalue 默认值 * @return */ public string getvalue(string filename,string key,string defaultvalue){ string val = null; properties properties = promap.get(filename); if(properties == null){ inputstream inputstream = propertiesutil.class.getclassloader().getresourceasstream(filename); try { properties = new properties(); properties.load(new inputstreamreader(inputstream,"utf-8")); promap.put(filename, properties); val = properties.getproperty(key,defaultvalue); } catch (ioexception e) { logger.error("getvalue",e); }finally{ try { if (inputstream != null) { inputstream.close(); } } catch (ioexception e1) { logger.error(e1.tostring()); } } }else{ val = properties.getproperty(key,defaultvalue); } return val; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。