java实现上传图片并压缩图片大小功能
Thumbnailator是一个优秀的图片处理的Google开源Java类库。处理效果远比JavaAPI的好。从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式,同时保持了需要写入的最低限度的代码量。还支持对一个目录的所有图片进行批量处理操作。
支持的处理操作:图片缩放,区域裁剪,水印,旋转,保持比例。
另外值得一提的是,Thumbnailator至今仍不断更新,怎么样,感觉很有保障吧!
下面我们介绍下如何使用Thumbnailator
使用介绍地址:
利用Thumbnailator轻松实现图片缩放、旋转与加水印
Java图片处理开源框架Thumbnailator
缩略图压缩文件jar包
net.coobird thumbnailator 0.4.8
按指定大小把图片进行缩放(会遵循原图高宽比例)
//按指定大小把图片进行缩和放(会遵循原图高宽比例) //此处把图片压成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:保存图片并且生成缩略图
*@paramimageFile图片文件
*@paramrequest请求对象
*@paramuploadPath上传目录
*@return
*/
publicstaticBaseResultuploadFileAndCreateThumbnail(MultipartFileimageFile,HttpServletRequestrequest,StringuploadPath){
if(imageFile==null){
returnnewBaseResult(false,"imageFile不能为空");
}
if(imageFile.getSize()>=10*1024*1024)
{
returnnewBaseResult(false,"文件不能大于10M");
}
Stringuuid=UUID.randomUUID().toString();
StringfileDirectory=CommonDateUtils.date2string(newDate(),CommonDateUtils.YYYY_MM_DD);
//拼接后台文件名称
StringpathName=fileDirectory+File.separator+uuid+"."
+FilenameUtils.getExtension(imageFile.getOriginalFilename());
//构建保存文件路劲
//2016-5-6yangkang修改上传路径为服务器上
StringrealPath=request.getServletContext().getRealPath("uploadPath");
//获取服务器绝对路径linux服务器地址获取当前使用的配置文件配置
//StringurlString=PropertiesUtil.getInstance().getSysPro("uploadPath");
//拼接文件路劲
StringfilePathName=realPath+File.separator+pathName;
log.info("图片上传路径:"+filePathName);
//判断文件保存是否存在
Filefile=newFile(filePathName);
if(file.getParentFile()!=null||!file.getParentFile().isDirectory()){
//创建文件
file.getParentFile().mkdirs();
}
InputStreaminputStream=null;
FileOutputStreamfileOutputStream=null;
try{
inputStream=imageFile.getInputStream();
fileOutputStream=newFileOutputStream(file);
//写出文件
//2016-05-12yangkang改为增加缓存
//IOUtils.copy(inputStream,fileOutputStream);
byte[]buffer=newbyte[2048];
IOUtils.copyLarge(inputStream,fileOutputStream,buffer);
buffer=null;
}catch(IOExceptione){
filePathName=null;
returnnewBaseResult(false,"操作失败",e.getMessage());
}finally{
try{
if(inputStream!=null){
inputStream.close();
}
if(fileOutputStream!=null){
fileOutputStream.flush();
fileOutputStream.close();
}
}catch(IOExceptione){
filePathName=null;
returnnewBaseResult(false,"操作失败",e.getMessage());
}
}
//StringfileId=FastDFSClient.uploadFile(file,filePathName);
/**
*缩略图begin
*/
//拼接后台文件名称
StringthumbnailPathName=fileDirectory+File.separator+uuid+"small."
+FilenameUtils.getExtension(imageFile.getOriginalFilename());
//addedbyyangkang2016-3-30去掉后缀中包含的.png字符串
if(thumbnailPathName.contains(".png")){
thumbnailPathName=thumbnailPathName.replace(".png",".jpg");
}
longsize=imageFile.getSize();
doublescale=1.0d;
if(size>=200*1024){
if(size>0){
scale=(200*1024f)/size;
}
}
//拼接文件路劲
StringthumbnailFilePathName=realPath+File.separator+thumbnailPathName;
try{
//addedbychenshun2016-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(Exceptione1){
returnnewBaseResult(false,"操作失败",e1.getMessage());
}
/**
*缩略图end
*/
Mapmap=newHashMap();
//原图地址
map.put("originalUrl",pathName);
//缩略图地址
map.put("thumbnailUrl",thumbnailPathName);
returnnewBaseResult(true,"操作成功",map);
}
获取当前使用的配置文件信息
/**
*根据key从gzt.properties配置文件获取配置信息
*@paramkey键值
*@return
*/
publicStringgetSysPro(Stringkey){
returngetSysPro(key,null);
}
/**
*根据key从gzt.properties配置文件获取配置信息
*@paramkey键值
*@paramdefaultValue默认值
*@return
*/
publicStringgetSysPro(Stringkey,StringdefaultValue){
returngetValue("spring/imageserver-"+System.getProperty("spring.profiles.active")+".properties",key,defaultValue);
}
例:
//获取服务器绝对路径linux服务器地址
StringurlString=PropertiesUtil.getInstance().getSysPro("uploadPath");
PropertiesUtil类
packagecom.xyz.imageserver.common.properties;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.util.Properties;
importjava.util.concurrent.ConcurrentHashMap;
/**
*
*@ClassNamePropertiesUtil.java
*@Description系统配置工具类
*@authorcaijy
*@date2015年6月9日上午10:50:38
*@version1.0.0
*/
publicclassPropertiesUtil{
privateLoggerlogger=LoggerFactory.getLogger(PropertiesUtil.class);
privateConcurrentHashMapproMap;
privatePropertiesUtil(){
proMap=newConcurrentHashMap();
}
privatestaticPropertiesUtilinstance=newPropertiesUtil();
/**
*获取单例对象
*@return
*/
publicstaticPropertiesUtilgetInstance()
{
returninstance;
}
/**
*根据key从gzt.properties配置文件获取配置信息
*@paramkey键值
*@return
*/
publicStringgetSysPro(Stringkey){
returngetSysPro(key,null);
}
/**
*根据key从gzt.properties配置文件获取配置信息
*@paramkey键值
*@paramdefaultValue默认值
*@return
*/
publicStringgetSysPro(Stringkey,StringdefaultValue){
returngetValue("spring/imageserver-"+System.getProperty("spring.profiles.active")+".properties",key,defaultValue);
}
/**
*从配置文件中获取对应key值
*@paramfileName配置文件名
*@paramkeykey值
*@paramdefaultValue默认值
*@return
*/
publicStringgetValue(StringfileName,Stringkey,StringdefaultValue){
Stringval=null;
Propertiesproperties=proMap.get(fileName);
if(properties==null){
InputStreaminputStream=PropertiesUtil.class.getClassLoader().getResourceAsStream(fileName);
try{
properties=newProperties();
properties.load(newInputStreamReader(inputStream,"UTF-8"));
proMap.put(fileName,properties);
val=properties.getProperty(key,defaultValue);
}catch(IOExceptione){
logger.error("getValue",e);
}finally{
try{
if(inputStream!=null){
inputStream.close();
}
}catch(IOExceptione1){
logger.error(e1.toString());
}
}
}else{
val=properties.getProperty(key,defaultValue);
}
returnval;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。