上传图片进行压缩保存
2012-12-12 16:51
495 查看
使用apache上传类进行上传
///////////////////////工具类处理////////////////////////////////////////////
package com.it.comm;
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;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
* TODO 图片等比压缩的工具方法
* @author
* @since
*/
public class CompressImageUtils {
/**
* 输出图片的宽
*/
private int outputWidth=200;
/**
* 输出图片的高
*/
private int outputHeight=150;
/**
* 是否等比缩放
*/
boolean proportion =true;
public CompressImageUtils(int targetWidth,int targetHeight,boolean proportion){
this.outputHeight = targetHeight;
this.outputWidth = targetWidth;
this.proportion = proportion;
}
public CompressImageUtils(){
}
public void compressImage(InputStream srcStream,File tagFile){
Image srcImg = null;
FileOutputStream out = null;
try {
srcImg = ImageIO.read(srcStream);
int newWidth;
int newHeight;
// 判断是否是等比缩放
if (proportion == true) {
// 为等比缩放计算输出的图片宽度及高度
double rate1 = ((double) srcImg.getWidth(null)) / (double) outputWidth + 0.1;
double rate2 = ((double) srcImg.getHeight(null)) / (double) outputHeight + 0.1;
// 根据缩放比率大的进行缩放控制
double rate = rate1 > rate2 ? rate1 : rate2;
newWidth = (int) (((double) srcImg.getWidth(null)) / rate);
newHeight = (int) (((double) srcImg.getHeight(null)) / rate);
} else {
newWidth = outputWidth; // 输出的图片宽度
newHeight = outputHeight; // 输出的图片高度
}
BufferedImage tagImg = new BufferedImage((int) newWidth, (int) newHeight, BufferedImage.TYPE_INT_RGB);
/*
* Image.SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的
* 优先级比速度高 生成的图片质量比较好 但速度慢
*/
tagImg.getGraphics().drawImage(srcImg.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH), 0, 0, null);
out = new FileOutputStream(tagFile);
// JPEGImageEncoder可适用于其他图片类型的转换
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(tagImg);
out.close();
} catch (IOException e) {
ExceptionHandler.logException(e);
}finally{
if(out!=null){
try {
out.close();
} catch (IOException e) {
ExceptionHandler.logException(e);
}
}
}
}
}
////////////////////////servlet中获取上传文件对象////////////////////////////
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(512);
File file = new File("c:\\1.jpg");
PathUtil.makeDirs(file);
factory.setRepository(file);
ServletFileUpload upload = new ServletFileUpload(factory);
//upload.setSizeMax(512);
List items = upload.parseRequest(request);
for(FileItem item : items){
writeFile(item,new Flie("c:\\test\\"+System.currentTimeMillis()+".jpg"));
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
private void writeFile(FileItem item, File uploadedFile) throws UploadException {
try {
//缩略图生成在您是文件生成
int outputWidth = 640;
int outputHeight = 480;
//大于5M的时候进行等比缩放
InputStream in = item.getInputStream();
if(item.getSize()>1024*1024*5){
File srcFile = new File(item.getName());
CompressImageUtils comprerssImage = new CompressImageUtils(outputWidth,outputHeight,true);
comprerssImage.compressImage(in , uploadedFile);
}else{
item.write(uploadedFile);
}
} catch (Exception e) {
}
}
///////////////////////工具类处理////////////////////////////////////////////
package com.it.comm;
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;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
* TODO 图片等比压缩的工具方法
* @author
* @since
*/
public class CompressImageUtils {
/**
* 输出图片的宽
*/
private int outputWidth=200;
/**
* 输出图片的高
*/
private int outputHeight=150;
/**
* 是否等比缩放
*/
boolean proportion =true;
public CompressImageUtils(int targetWidth,int targetHeight,boolean proportion){
this.outputHeight = targetHeight;
this.outputWidth = targetWidth;
this.proportion = proportion;
}
public CompressImageUtils(){
}
public void compressImage(InputStream srcStream,File tagFile){
Image srcImg = null;
FileOutputStream out = null;
try {
srcImg = ImageIO.read(srcStream);
int newWidth;
int newHeight;
// 判断是否是等比缩放
if (proportion == true) {
// 为等比缩放计算输出的图片宽度及高度
double rate1 = ((double) srcImg.getWidth(null)) / (double) outputWidth + 0.1;
double rate2 = ((double) srcImg.getHeight(null)) / (double) outputHeight + 0.1;
// 根据缩放比率大的进行缩放控制
double rate = rate1 > rate2 ? rate1 : rate2;
newWidth = (int) (((double) srcImg.getWidth(null)) / rate);
newHeight = (int) (((double) srcImg.getHeight(null)) / rate);
} else {
newWidth = outputWidth; // 输出的图片宽度
newHeight = outputHeight; // 输出的图片高度
}
BufferedImage tagImg = new BufferedImage((int) newWidth, (int) newHeight, BufferedImage.TYPE_INT_RGB);
/*
* Image.SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的
* 优先级比速度高 生成的图片质量比较好 但速度慢
*/
tagImg.getGraphics().drawImage(srcImg.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH), 0, 0, null);
out = new FileOutputStream(tagFile);
// JPEGImageEncoder可适用于其他图片类型的转换
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(tagImg);
out.close();
} catch (IOException e) {
ExceptionHandler.logException(e);
}finally{
if(out!=null){
try {
out.close();
} catch (IOException e) {
ExceptionHandler.logException(e);
}
}
}
}
}
////////////////////////servlet中获取上传文件对象////////////////////////////
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(512);
File file = new File("c:\\1.jpg");
PathUtil.makeDirs(file);
factory.setRepository(file);
ServletFileUpload upload = new ServletFileUpload(factory);
//upload.setSizeMax(512);
List items = upload.parseRequest(request);
for(FileItem item : items){
writeFile(item,new Flie("c:\\test\\"+System.currentTimeMillis()+".jpg"));
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
private void writeFile(FileItem item, File uploadedFile) throws UploadException {
try {
//缩略图生成在您是文件生成
int outputWidth = 640;
int outputHeight = 480;
//大于5M的时候进行等比缩放
InputStream in = item.getInputStream();
if(item.getSize()>1024*1024*5){
File srcFile = new File(item.getName());
CompressImageUtils comprerssImage = new CompressImageUtils(outputWidth,outputHeight,true);
comprerssImage.compressImage(in , uploadedFile);
}else{
item.write(uploadedFile);
}
} catch (Exception e) {
}
}
相关文章推荐
- 在浏览器端对图片进行压缩 & 上传
- 网上图片本地保存并进行压缩操作
- 服务器端根据数据库图片的url获取保存的图片并进行缩略后返回给客户端-压缩之Thumbnails
- kindeditor 隐藏网络图片功能,只保留本地上传功能,并且将图片进行压缩处理
- 使用ueditor进行图片上传、保存、存入数据库
- 服务器端根据数据库图片的url获取保存的图片并进行缩略后返回给客户端-压缩之Thumbnails
- Android部分手机拍照上传返回为空处理,和拍照后图片压缩后保存到指定路径下
- 服务器端根据数据库图片的url获取保存的图片并进行缩略后返回给客户端-压缩之Thumbnails
- 上传图片图像进行压缩后上传
- 服务器端根据数据库图片的url获取保存的图片并进行缩略后返回给客户端-压缩之Thumbnails
- 上传图片(图片路径和图片本身都进行保存)
- 服务器端根据数据库图片的url获取保存的图片并进行缩略后返回给客户端-压缩之Thumbnails
- 服务器端根据数据库图片的url获取保存的图片并进行缩略后返回给客户端-压缩之Thumbnails
- 上传图片到服务器 对图片进行压缩
- iOS 使用AFN 进行单图和多图上传 摄像头/相册获取图片,压缩图片
- vue之使用Cropper进行图片剪裁上传压缩
- Ueditor1.4.3上传图片参照宽度或高度进行压缩(默认最长边)
- 服务器端根据数据库图片的url获取保存的图片并进行缩略后返回给客户端-压缩之Thumbnails
- Android拍照并保存(对图片进行压缩,分解)
- android上传手机图片至服务器,服务器进行保存