欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java实现上传图片并压缩图片大小功能

程序员文章站 2024-02-21 21:55:52
thumbnailator 是一个优秀的图片处理的google开源java类库。处理效果远比java api的好。从api提供现有的图像文件和图像对象的类中简化了处理过程,...

thumbnailator 是一个优秀的图片处理的google开源java类库。处理效果远比java api的好。从api提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式,同时保持了需要写入的最低限度的代码量。还支持对一个目录的所有图片进行批量处理操作。

支持的处理操作:图片缩放,区域裁剪,水印,旋转,保持比例。

另外值得一提的是,thumbnailator至今仍不断更新,怎么样,感觉很有保障吧!

下面我们介绍下如何使用thumbnailator

使用介绍地址:

利用thumbnailator轻松实现图片缩放、旋转与加水印

java图片处理开源框架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;
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。