2016/10/11
package com.xj.console.util;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
//此包是针对文件的上传时引用的包(springMVC)
import org.springframework.web.multipart.MultipartFile;
//下面这两个包已经被JDK1.7移除,在引用的时候要是报错的话
//在Eclipse中将编译器针对过时的类报错的地方改成警告即可
//(Preferences/Java/compiler/errors/warning/forbidden-->waring)
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
*本类的作用就是将图片文件压缩成指定的宽度和长度
*/
public class CompressPicDemo(){
private File file = null;//文件对象
private String inputDir;//输入图路径
private String outputDir;//输出图路径
private String inputFileName;//输入图文件名
private String outputFileName;//输出图文件名
private int outputWidth = 100;//输出图片宽度
private int outputHeight = 100;//输出图片高度
private boolean proportion = true;//输出图片是否等比缩放(默认为true)
private MultipartFile myFile;//文件上传MultipartFile对象
//初始化变量
public CompressPicDemo(){
inputDir = "";
outputDir = "";
inputFileName = "";
outputFileName = "";
outputWidth = 100;
outputHeight = 100;
}
//属性set方法为对象赋值
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;
}
public void setMyFile(MultipartFile myFile) {
this.myFile = myFile;
}
//-----------------下面就是调用的方法
/**
*获得图片大小
*String path:图片路径
*/
public long getPicSize(String path){
file = new File(path);
if(!file.exists){
return 0;
}else{
return file.length();
}
}
/*
*图片处理:不涉及文件上传,简单根据传过来的图片路径和图片名称进行压缩处理
*/
public String compressPic(){
try{
//获得文件源
file = new File(inputDir+inputFileName);
if(!file.exists()){
return "";
}
//imageIO.read(arg);图片解析,可传入文件,文件输入流等
Image img = ImageIO.read(file);
if(img.getWidth(null) == -1){
return "no";
}else{
int newWidth;
int newHeight;
//判断是否等比缩放
if(this.proportion == true ){
double rate = (double)img.getWidth(null)/(double)outputWidth;
newWidth = outputWidth;
newHeight = ((double)img.getHeight(null)/rate).intValue();
}else{
newWidth = outputWidth;
newHeight = outputHeght;
}
/**
*Image.SCALE_SMOOTH的缩略算法生成缩略图片的平滑度的优先级比速度高,生成的图片质量好但是速度慢
*根据具体要求取舍时间或是质量
*/
BufferedImage tag = new BufferedImage((int)newWidth,(int)newHeight,BufferedImage.TYPE_INT_RGB);
/* @param img the specified image to be drawn.
* @param x x坐标.
* @param y y坐标.
* @param width the width of the rectangle.
* @param height the height of the rectangle.
* @param observer 像素是否被改变
*/
tag.getGraphics().drawImage(img,0,0,newWidth,newHeight,null);
FileOutputStream out = new FileoutputStream(outputDir+outputFileName);
//JPEGImageEncoder可适用于其他图片的类型的转换
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(tag);
out.close;
}
}
}
/*
*图片处理:涉及文件上传,上传文件获取的是MultipartFile对象,而不是文件路径或是文件名
*/
public String compressPicVersion2(){
try{
if(myFile.empty()){
return "";
}
Image img = ImageIO.read(myFile.getInputStream());
if(img.getWidth(null) == -1){
return "no";
}else{
int newWidth;
int newHeight;
if(this.proportion == true ){
double rate = (double)img.getWidth(null)/(double)outputWidth;
newWidth = outputWidth;
newHeight = ((double)img.getHeight(null)/rate).intValue();
}else{
newWidth = outputWidth;
newHeight = outputHeght;
}
BufferedImage tag = new BufferedImage((int)newWidth,(int)newHeight,BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(img,0,0,newWidth,newHeight,null);
FileOutputStream out = new FileoutputStream(outputDir+outputFileName);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(tag);
out.close;
}
}
}
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();
}
public String compressPicVersion2( MultipartFile myFile , String outputDir, String outputFileName,
int width, int height, boolean gp) {
this.myFile = myFile;
// 输出图路径
this.outputDir = outputDir;
// 输出图文件名
this.outputFileName = outputFileName;
// 设置图片长宽
setWidthAndHeight(width, height);
// 是否是等比缩放 标记
this.proportion = gp;
return compressPicVersion2();
}
// main测试
// compressPic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度,是否等比缩放(默认为true))
public static void main(String[] arg) {
CompressPicDemo mypic = new CompressPicDemo();
int count = 0; // 记录全部图片压缩所用时间
for (int i = 0; i < 10; i++) {//压缩十张图片
System.out.println("输入的图片大小:" + mypic.getPicSize("e:/temp/"+i+".jpg") / 1024 + "KB");
int start = (int) System.currentTimeMillis(); // 开始时间
mypic.compressPic("e:/temp/", "e:/tempCopy/", i+".jpg", "r1" + i + ".jpg", 600, 600, true);
int end = (int) System.currentTimeMillis(); // 结束时间
int re = end - start; // 但图片生成处理时间
count += re;
System.out.println("第" + (i + 1) + "张图片压缩处理使用了: " + re + "毫秒");
System.out.println("输出的图片大小:" + mypic.getPicSize("e:/tempCopy/r1" + i + ".jpg") / 1024 + "KB");
}
System.out.println("总共用了:" + count + "毫秒");
}
}
Java实现图片的压缩(包括文件上传的图片压缩)
猜你喜欢
转载自blog.csdn.net/qq844579582/article/details/52790344
今日推荐
周排行