java实现上传图片尺寸修改和质量压缩-亚博电竞手机版
本文实例为大家分享了java实现上传图片尺寸修改和质量压缩的具体代码,供大家参考,具体内容如下
package com.zity.frame.util; /** * 缩略图实现,将图片(jpg、bmp、png、gif等等)真实的变成想要的大小 */ import com.sun.image.codec.jpeg.jpegcodec; import com.sun.image.codec.jpeg.jpegimageencoder; import net.sourceforge.pinyin4j.pin恰卡编程网yinhelper; import javax.imageio.imageio; import java.awt.*; import java.awt.image.bufferedimage; import java.io.*; import java.net.malformedurlexception;ycsyqnqyd import java.net.url; import java.net.urlconnection; import java.util.random; /******************************************************************************* * 缩略图类(通用) 本java类能将jpg、bmp、png、gif图片文件,进行等比或非等比的大小转换。 具体使用方法 * compresspic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度,是否等比缩放(默认为true)) */ public class compresspic { private file file = null; // 文件对象 private string inputdir; // 输入图路径 private string outputdir; // 输出图路径 private string inputfilename; // 输入图文件名 private string outputfilename; // 输出图文件名 private int outputwidth = 300; // 默认输出图片宽 private int outputheight = 150; // 默认输出图片高 private boolean proportion = true; // 是否等比缩放标记(默认为等比缩放) public compresspic() { // 初始化变量 inputdir = ""; outputdir = ""; inputfilename = ""; outputfilename = ""; outputwidth = 300; outputheight = 150; } public void setinputdir(string inputdir) { this.inputdir = inputdir; } public void setoutputdir(string outputdir) { this.outputdir = outputdir; } public void setinputfilename(string inputfilename) { this.inputfilename = inputfilename; } public void setoutputfilename(string outputfilename) { this.outputfilename = outputfilename; } public void setoutputwidth(int outputwidth) { this.outputwidth = outputwidth; } public void setoutputheight(int outputheight) { this.outputheight = outputheight; } public void setwidthandheight(int width, int height) { this.outputwidth = width; this.outputheight = height; } /* * 获得图片大小 * 传入参数 string path :图片路径 */ public long getpicsize(string path) { file = new file(path); return file.length(); } /** * 图片处理 * @return */ public string compresspic() { try { //获得源文件 file = new file(inputdir inputfilename); if (!file.exists()) { return ""; } // 生成存储路径 file outdir = new file(outputdir); if(!outdir.exists()){ outdir.mkdirs(); } image img = imageio.read(file); // 判断图片格式是否正确 if(img==null){ return ""; } if (img.getwidth(null) == -1) { system.out.println(" can't read,retry!" "
"); return "no"; } else { int newwidth; int newheight; // 判断是否是等比缩放 if (this.proportion == true) { // 为等比缩放计算输出的图片宽度及高度 int w =img.getwidth(null); int h = img.getheight(null); //如果图片的宽度小于等于250,并且高度小于等于183,图片原样输出 if(w<=300){ outputwidth=w; } if(h<=150){ outputheight=h; } double rate1 = ((double) img.getwidth(null)) / (double) outputwidth; double rate2 = ((double) img.getheight(null)) / (double) outputheight; // 根据缩放比率大的进行缩放控制 // double rate = rate1 > rate2 ? rate1 : rate2; // 保证宽度为250px double rate = rate1; newwidth = (int) (((double) img.getwidth(null)) / rate); newheight = (int) (((double) img.getheight(null)) / rate2); } else { newwidt恰卡编程网h = outputwidth; // 输出的图片宽度 newheight = outputheight; // 输出的图片高度 } //重新设置高宽为图片真实高宽,上面的高宽是其他项目需要300*150的,我没得空删掉 newwidth = getimgwidth(file); newheight = getimgheight(file); bufferedimage tag = new bufferedimage((int) newwidth, (int) newheight, bufferedimage.type_int_rgb); /* * image.scale_smooth 的缩略算法 生成缩略图片的平滑度的 * 优先级比速度高 生成的图片质量比较好 但速度慢 */ tag.getgraphics().drawimage(img.getscaledinstance(newwidth, newheight, image.scale_smooth), 0, 0, null); fileoutputstream out = new fileoutputstream(outputdir outputfilename); // jpegimageencoder可适用于其他图片类型的转换 jpegimageencoder encoder = jpegcodec.createjpegencoder(out); encoder.encode(tag); out.close(); } } catch (ioexceptionycsyqnqyd ex) { ex.printstacktrace(); } return "ok"; } /** * 图片处理入口 * @param inputdir 输入图路径 * @param outputdir 输出图路径 * @param inputfilename 输入图名 * @param outputfilename 输出图名 * @return */ public string compresspic (string inputdir, string outputdir, string inputfilename, string outputfilename) { // 输入图路径 this.inputdir = inputdir; // 输出图路径 this.outputdir = outputdir; // 输入图文件名 this.inputfilename = inputfilename; // 输出图文件名 this.outputfilename = outputfilename; return compresspic(); } /** * 图片处理入口 * @param inputdir 输入图路径 * @param outputdir 输出图路径 * @param inputfilename 输入图名 * @param outputfilename 输出图名 * @param width 输出图宽度 * @param height 输入图宽度 * @param gp 等比缩放 * @return */ public string compresspic(string inputdir, string outputdir, string inputfilename, string outputfilename, int width, int height, boolean gp) { // 输入图路径 this.inputdir = inputdir; // 输出图路径 this.outputdir = outputdir; // 输入图文件名 this.inputfilename = inputfilename; // 输出图文件名 this.outputfilename = outputfilename; // 设置图片长宽 setwidthandheight(width, height); // 是否是等比缩放 标记 this.proportion = gp; return compresspic(); } /** * 图片压缩 * @param downloadurl * @param inputdir * @param outdir * @return */ public string imagecompression(string downloadurl,string inputdir,string outdir){ random rnd = new random(); string picname = downloadurl.substring(downloadurl.lastindexof("/") 1); string extendname =""; string beforename= ""; if(picname.contains(".")){ extendname = picname.substring(picname.indexof(".")); beforename= picname.substring(0,picname.indexof(".")); }else{ extendname = picname; beforename= picname; } //随机数 integer r = rnd.nextint(1000); beforename = new compresspic().getpinyinheadchar(beforename); long ts = system.currenttimemillis(); string outpicname=ts beforename r ".jpg"; outpicname = outpicname.replace("%", ""); if(outpicname.contains("张栋杰总经理会见旭阳集团董事长杨雪岗")){ outpicname="zdjzjlhjxyjtdszyxg.jpg"; } if(httpdownload(downloadurl, inputdir, outpicname)){ // 当前时间 // string curtime = new long(system.currenttimemillis()).tostring(); this.compresspic(inputdir, outdir, outpicname, outpicname, 300, 150, true); return outpicname; }else { return null; } } /** * http图片下载 * @param httpurl * @param savefile * @return */ public static boolean httpdownload(string httpurl,string savedir,string savename){ // 下载网络文件 int bytesum = 0; int byteread = 0; url url = null; try { url = new ; } catch (malformedurlexception e1) { e1.printstacktrace(); return false; } // 存储目录 file outdir = new file(savedir); if(!outdir.exists()){ outdir.mkdirs(); } try { urlconnection conn = url.openconnection(); inputstream instream = conn.getinputstream(); fileoutputstream fs = new fileoutputstream(savedir savename); byte[] buffer = new byte[1204]; while ((byteread = instream.read(buffer)) != -1) { bytesum = byteread; fs.write(buffer, 0, byteread); } fs.close(); instream.close(); } catch (filenotfoundexception e) { e.printstacktrace(); return false; } catch (ioexception e) { e.printstacktrace(); return false; } return true; } /** * 提取每个汉字的首字母 * * @param str * @return string */ public string getpinyinheadchar(string str) { string coycsyqnqydnvert = ""; for (int j = 0; j < str.length(); j ) { char word = str.charat(j); // 提取汉字的首字母 string[] pinyinarray = pinyinhelper.tohanyupinyinstringarray(word); if (pinyinarray != null) { convert = pinyinarray[0].charat(0); } else { convert = word; } } return convert; } public static void main(string[] arg) { compresspic mypic = new compresspic(); mypic.compresspic("c:\\users\\mazhaoxu\\desktop\\", "c:\\users\\mazhaoxu\\desktop\\", "微信图片_20180712182800.png", "2019061818542824511111111111.png"); // if(httpdownload("http://221.195.72.44:8122/nr/rdonlyres/b5071de7-9652-44af-9534-0ee0ed2dca92/15177/resource_651768621.jpg", "d:\\data\\resource_651768621.jpg")){ // int start = (int) system.currenttimemillis(); // 开始时间 // mypic.compresspic("d:\\data\\", "d:\\data\\", "resource_651768621.jpg", "r1" start ".jpg", 250, 250, true); // } // string s= mypic.getpinyinheadchar("http://114.251.186.42:81/web-s/images/1447069462915xfydh1_fb_fb521.jpg"); // mypic.imagecompression("http://114.251.186.42:81/web-s/images/mobile/1447069462915xfydh1_fb_fb521.jpg","d:\\images\\", "d:\\images\\mobile\\"); // mypic.compresspic("d:\\", "d:\\image\\mobile", "144921941137520151204fgw1747.jpg", "144921941137520151204fgw1747.jpg"); // string s = "/image/dslfsjss/image/sisis /image"; // system.out.println(s.replace("/image/", "/mobile/image/")); } /** * 获取图片宽度 * @param file 图片文件 * @return 宽度 */ public static int getimgwidth(file file) { inputstream is = null; bufferedimage src = null; int ret = -1; try { is = new fileinputstream(file); src = javax.imageio.imageio.read(is); ret = src.getwidth(null); // 得到源图宽 is.close(); } catch (exception e) { e.printstacktrace(); } return ret; } /** * 获取图片高度 * @param file 图片文件 * @return 高度 */ public static int getimgheight(file file) { inputstream is = null; bufferedimage src = null; int ret = -1; try { is = new fileinputstream(file); src = javax.imageio.imageio.read(is); ret = src.getheight(null); // 得到源图高 is.close(); } catch (exception e) { e.printstacktrace(); } return ret; } }
这是我用的工具类,其中里面业务会用到pinyin4j的jar包,和图片压缩关系不大,可以去除,我是因为比较着急改完,就没动,如果不想改,需要引入pinyin4j的jar包。
maven:
可以自行用上面工具类里的main方法进行测试
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。