java实现上传图片尺寸修改和质量压缩(图片大了怎么压缩到上传大小)

网友投稿 523 2022-08-03


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.PinyinHelper;

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 {

newWidth = 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 URL(httpUrl);

} 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:

com.belerweb

pinyin4j

2.5.0

可以自行用上面工具类里的main方法进行测试


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java实现按比例缩小图片(把图片比例缩小)
下一篇:elasticsearch索引的创建过程index create逻辑分析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~