package com.mxo9.b2c.service.administration.impl.goodstrading.goods;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
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;
public class AlterUploadImage {
String inputDir; //源图片的绝对路径,不包含图片的文件名
String outputDir; //目标图片的绝对路径,不包含图片的文件名
String inputFileName; //源图片文件名
String outputFileName; //目标图片的文件名
int outputWidth; //目标图片的宽
int outputHeight; //目标图片的高
boolean proportion = true; //是否等比例缩放
private String inputFileUrl;//源图片的绝对路径,包含文件名
private String outputFileUrl;//目标图片的绝对路径,包含文件名
private String tempUrl;
/**
* 初始化修改图片大小的参数
* @param inputDir 源图片的绝对路径,不包含图片的文件名
* @param outputDir 目标图片的绝对路径,不包含图片的文件名
* @param inputFileName 源图片文件名
* @param outputFileName 目标图片的文件名
* @param outputWidth 目标图片的宽
* @param outputHeight 目标图片的高
* @param proportion 是否等比例缩放
*/
public AlterUploadImage(String inputDir, String outputDir,
String inputFileName, String outputFileName, int outputWidth,
int outputHeight, boolean proportion) {
this.inputDir=inputDir;
this.outputDir=outputDir;
this.inputFileName= inputFileName;
this.outputFileName=outputFileName;
this.outputWidth=outputWidth;
this.outputHeight=outputHeight;
this.proportion=proportion;
}
public AlterUploadImage() {
inputDir="";
outputDir="";
inputFileName="";
outputFileName="";
outputWidth=100;
outputHeight=100;
proportion=true;
}
public boolean alterImageSize() throws IOException {
//构造源、目标图片的路径
inputFileUrl=inputDir+inputFileName;
outputFileUrl=outputDir+outputFileName;
createDir(outputDir);
try {
Image image = javax.imageio.ImageIO.read(new File(inputFileUrl));
int imageWidth = image.getWidth(null);
int imageHeight = image.getHeight(null);
float scale = getRatio(imageWidth,imageHeight,outputWidth,outputHeight);
imageWidth = (int)(scale*imageWidth);
imageHeight = (int)(scale*imageHeight);
image = image.getScaledInstance(imageWidth, imageHeight, Image.SCALE_AREA_AVERAGING);
// Make a BufferedImage from the Image.
BufferedImage mBufferedImage = new BufferedImage(imageWidth, imageHeight,BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = mBufferedImage.createGraphics();
g2.drawImage(image, 0, 0,imageWidth, imageHeight, Color.white,null);
g2.dispose();
float[] kernelData2 = {-0.125f,-0.125f,-0.125f,-0.125f,2,-0.125f,-0.125f,-0.125f,-0.125f};
Kernel kernel = new Kernel(3, 3, kernelData2);
ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
mBufferedImage = cOp.filter(mBufferedImage, null);
FileOutputStream out = new FileOutputStream(outputFileUrl);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(mBufferedImage);
out.close();
return true;
}catch (Exception ioe){
return false;
}
finally{
}
//return ThumbnailUtil.creatThumbnail(inputFileUrl, outputFileUrl, outputWidth, outputHeight);
// File fileOut = new File(tempUrl);
// File fileIn = new File(inputFileUrl);
// FileOutputStream tempout = null;
// try {
// tempout = new FileOutputStream(fileOut);
// } catch (Exception ex) {
// System.out.println(ex.toString());
// }
// Image img = null;
// Applet app = new Applet();
// MediaTracker mt = new MediaTracker(app);
// try {
// img = javax.imageio.ImageIO.read(fileIn);
// mt.addImage(img, 0);
// mt.waitForID(0);
// } catch (Exception e) {
// e.printStackTrace();
// }
// if (img.getWidth(null) == -1) {
// return false;
// } else {
// int new_w;
// int new_h;
// if (this.proportion == true) {//判断是否等比例缩放
// //计算比率
// double rate1 = ((double) img.getWidth(null)) / (double) outputWidth + 0.1;
// double rate2 = ((double) img.getHeight(null)) / (double) outputHeight + 0.1;
// double rate = rate1 > rate2 ? rate1 : rate2;
// new_w = (int) (((double) img.getWidth(null)) / rate);
// new_h = (int) (((double) img.getHeight(null)) / rate);
// } else {
// new_w = outputWidth; //宽
// new_h = outputHeight; //高
// }
// BufferedImage buffImg = new BufferedImage(new_w, new_h,
// BufferedImage.TYPE_INT_RGB);
//
// Graphics g = buffImg.createGraphics();
//
// g.setColor(Color.white);
// g.fillRect(0, 0, new_w, new_h);
//
// g.drawImage(img, 0, 0, new_w, new_h, null);
// g.dispose();
// JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(tempout);
// try {
// encoder.encode(buffImg);
// tempout.close();
// } catch (IOException ex) {
// System.out.println(ex.toString());
// }
// }
// createThumbImg(outputWidth,outputHeight);
// fileOut.delete();
// return true;
}
public static float getRatio(int width,int height,int maxWidth,int maxHeight){
float Ratio = 1.0f;
float widthRatio ;
float heightRatio ;
widthRatio = (float)maxWidth/width;
heightRatio = (float)maxHeight/height;
if(widthRatio<1.0 || heightRatio<1.0){
Ratio = widthRatio<=heightRatio?widthRatio:heightRatio;
}
return Ratio;
}
//文亮,2009/07/15
public boolean alterImageSizeForFriendLink() throws IOException {
//构造源、目标图片的路径
inputFileUrl=inputDir+inputFileName;
outputFileUrl=outputDir+outputFileName;
tempUrl=outputDir+outputFileName;
createDir(tempUrl);
File fileOut = new File(tempUrl);
File fileIn = new File(inputFileUrl);
FileOutputStream tempout = null;
try {
tempout = new FileOutputStream(fileOut);
} catch (Exception ex) {
System.out.println(ex.toString());
}
Image img = null;
Applet app = new Applet();
MediaTracker mt = new MediaTracker(app);
try {
img = javax.imageio.ImageIO.read(fileIn);
mt.addImage(img, 0);
mt.waitForID(0);
} catch (Exception e) {
e.printStackTrace();
}
if (img.getWidth(null) == -1) {
return false;
} else {
int new_w;
int new_h;
if (this.proportion == true) {//判断是否等比例缩放
//计算比率
double rate1 = ((double) img.getWidth(null)) / (double) outputWidth + 0.1;
double rate2 = ((double) img.getHeight(null)) / (double) outputHeight + 0.1;
double rate = rate1 > rate2 ? rate1 : rate2;
new_w = (int) (((double) img.getWidth(null)) / rate);
new_h = (int) (((double) img.getHeight(null)) / rate);
} else {
new_w = outputWidth; //宽
new_h = outputHeight; //高
}
BufferedImage buffImg = new BufferedImage(new_w, new_h,
BufferedImage.TYPE_INT_RGB);
Graphics g = buffImg.createGraphics();
//g.setColor(Color.white);
g.fillRect(0, 0, new_w, new_h);
g.drawImage(img, 0, 0, new_w, new_h, null);
g.dispose();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(tempout);
try {
encoder.encode(buffImg);
tempout.close();
} catch (IOException ex) {
System.out.println(ex.toString());
}
}
return true;
}
//文亮,2009/07/15,图片批量处理
public boolean alterImageSizeForPicBatch() throws IOException {
//构造源、目标图片的路径
inputFileUrl=inputDir+inputFileName;
outputFileUrl=outputDir+outputFileName;
tempUrl=outputDir+"temp"+outputFileName;
createDir(tempUrl);
File fileOut = new File(tempUrl);
File fileIn = new File(inputFileUrl);
FileOutputStream tempout = null;
try {
tempout = new FileOutputStream(fileOut);
} catch (Exception ex) {
System.out.println(ex.toString());
}
Image img = null;
Applet app = new Applet();
MediaTracker mt = new MediaTracker(app);
try {
img = javax.imageio.ImageIO.read(fileIn);
mt.addImage(img, 0);
mt.waitForID(0);
} catch (Exception e) {
e.printStackTrace();
}
if (img.getWidth(null) == -1) {
return false;
} else {
int new_w;
int new_h;
if (this.proportion == true) {//判断是否等比例缩放
//计算比率
double rate1 = ((double) img.getWidth(null)) / (double) outputWidth + 0.1;
double rate2 = ((double) img.getHeight(null)) / (double) outputHeight + 0.1;
double rate = rate1 > rate2 ? rate1 : rate2;
new_w = (int) (((double) img.getWidth(null)) / rate);
new_h = (int) (((double) img.getHeight(null)) / rate);
} else {
new_w = outputWidth; //宽
new_h = outputHeight; //高
}
BufferedImage buffImg = new BufferedImage(new_w, new_h,
BufferedImage.TYPE_INT_RGB);
Graphics g = buffImg.createGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, new_w, new_h);
g.drawImage(img, 0, 0, new_w, new_h, null);
g.dispose();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(tempout);
try {
encoder.encode(buffImg);
tempout.close();
} catch (IOException ex) {
System.out.println(ex.toString());
}
}
//createThumbImg(outputWidth,outputHeight);
//fileOut.delete();
return true;
}
/**
* 该方法用于对生成的图片进一步处理,处理的要求就是创建一个高度为参数outputHeight宽度为outputWidth的图像,其背景色为白色,然后将生成的图片放在该图像的中央
* 以创建一张新图片
* @param width 新图片的宽度
* @param height 新图片的高度
* @throws IOException
*/
public void createThumbImg(int width,int height) throws IOException{
int startX=0;
int startY=0;
int[] ImageArrayOne=new int[width*height];
for(int i=0;i<ImageArrayOne.length;i++){
ImageArrayOne[i]=Color.WHITE.getRGB();
}
//对第二张图片做相同的处理
File fileTwo = new File(tempUrl);
BufferedImage ImageTwo = ImageIO.read(fileTwo);
int imgWidth = ImageTwo.getWidth();//图片宽度
int imgHeight = ImageTwo.getHeight();//图片高度
int[] ImageArray = new int[imgWidth*imgHeight];
ImageArray = ImageTwo.getRGB(0,0,imgWidth,imgHeight,ImageArray,0,imgWidth);
startX=(width-imgWidth)/2;
startY=(height-imgHeight)/2;
//生成新图片
BufferedImage ImageNew = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
ImageNew.setRGB(0,0,width,height,ImageArrayOne,0,width);//设置背景色为白色
ImageNew.setRGB(startX,startY,imgWidth,imgHeight,ImageArray,0,imgWidth);//将缩略图置于最上面
File outFile = new File(outputFileUrl);
ImageIO.write(ImageNew, outputFileUrl.substring(outputFileUrl.lastIndexOf(".")+1), outFile);//写图片
}
private void createDir(String path){
String realPath;
try{
realPath=path.substring(0,path.lastIndexOf("/"));
}
catch(Exception e){
realPath=path.substring(0,path.lastIndexOf("\\"));
}
File dir=new File(realPath);
dir.mkdirs();
}
public String getInputDir() {
return inputDir;
}
public void setInputDir(String inputDir) {
this.inputDir = inputDir;
}
public String getOutputDir() {
return outputDir;
}
public void setOutputDir(String outputDir) {
this.outputDir = outputDir;
}
public String getInputFileName() {
return inputFileName;
}
public void setInputFileName(String inputFileName) {
this.inputFileName = inputFileName;
}
public String getOutputFileName() {
return outputFileName;
}
public void setOutputFileName(String outputFileName) {
this.outputFileName = outputFileName;
}
public int getOutputWidth() {
return outputWidth;
}
public void setOutputWidth(int outputWidth) {
this.outputWidth = outputWidth;
}
public int getOutputHeight() {
return outputHeight;
}
public void setOutputHeight(int outputHeight) {
this.outputHeight = outputHeight;
}
public boolean isProportion() {
return proportion;
}
public void setProportion(boolean proportion) {
this.proportion = proportion;
}
public String getInputFileUrl() {
return inputFileUrl;
}
public void setInputFileUrl(String inputFileUrl) {
this.inputFileUrl = inputFileUrl;
}
public String getOutputFileUrl() {
return outputFileUrl;
}
public void setOutputFileUrl(String outputFileUrl) {
this.outputFileUrl = outputFileUrl;
}
}