来源: http://wing929.javaeye.com/blog/185508
方法1:[第一种方法比后一种生成的缩略图要清晰]
- importjavax.imageio.ImageIO;
- importjava.awt.image.BufferedImage;
- importjava.awt.image.ColorModel;
- importjava.awt.image.WritableRaster;
- importjava.awt.*;
- importjava.awt.geom.AffineTransform;
- importjava.io.InputStream;
- importjava.io.File;
- importjava.io.FileOutputStream;
- publicclassTest{
- publicstaticBufferedImageresize(BufferedImagesource,inttargetW,inttargetH){
- //targetW,targetH分别表示目标长和宽
- inttype=source.getType();
- BufferedImagetarget=null;
- doublesx=(double)targetW/source.getWidth();
- doublesy=(double)targetH/source.getHeight();
- //这里想实现在targetW,targetH范围内实现等比缩放。如果不需要等比缩放
- //则将下面的ifelse语句注释即可
- if(sx>sy)
- {
- sx=sy;
- targetW=(int)(sx*source.getWidth());
- }else{
- sy=sx;
- targetH=(int)(sy*source.getHeight());
- }
- if(type==BufferedImage.TYPE_CUSTOM){//handmade
- ColorModelcm=source.getColorModel();
- WritableRasterraster=cm.createCompatibleWritableRaster(targetW,targetH);
- booleanalphaPremultiplied=cm.isAlphaPremultiplied();
- target=newBufferedImage(cm,raster,alphaPremultiplied,null);
- }else
- target=newBufferedImage(targetW,targetH,type);
- Graphics2Dg=target.createGraphics();
- //smootherthanexlax:
- g.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);
- g.drawRenderedImage(source,AffineTransform.getScaleInstance(sx,sy));
- g.dispose();
- returntarget;
- }
- publicstaticvoidsaveImageAsJpg(StringfromFileStr,StringsaveToFileStr,intwidth,inthight)
- throwsException{
- BufferedImagesrcImage;
- //Stringex=fromFileStr.substring(fromFileStr.indexOf("."),fromFileStr.length());
- StringimgType="JPEG";
- if(fromFileStr.toLowerCase().endsWith(".png")){
- imgType="PNG";
- }
- //System.out.println(ex);
- FilesaveFile=newFile(saveToFileStr);
- FilefromFile=newFile(fromFileStr);
- srcImage=ImageIO.read(fromFile);
- if(width>0||hight>0)
- {
- srcImage=resize(srcImage,width,hight);
- }
- ImageIO.write(srcImage,imgType,saveFile);
- }
- publicstaticvoidmain(Stringargv[]){
- try{
- //参数1(from),参数2(to),参数3(宽),参数4(高)
- Test.saveImageAsJpg("E:/Document/MyPictures/3.gif","c:/6.gif",50,50);
- }catch(Exceptione)
- {
- e.printStackTrace();
- }
- }
- }
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.io.InputStream;
import java.io.File;
import java.io.FileOutputStream;
public class Test {
public static BufferedImage resize(BufferedImage source, int targetW, int targetH) {
// targetW,targetH分别表示目标长和宽
int type = source.getType();
BufferedImage target = null;
double sx = (double) targetW / source.getWidth();
double sy = (double) targetH / source.getHeight();
//这里想实现在targetW,targetH范围内实现等比缩放。如果不需要等比缩放
//则将下面的if else语句注释即可
if(sx>sy)
{
sx = sy;
targetW = (int)(sx * source.getWidth());
}else{
sy = sx;
targetH = (int)(sy * source.getHeight());
}
if (type == BufferedImage.TYPE_CUSTOM) { //handmade
ColorModel cm = source.getColorModel();
WritableRaster raster = cm.createCompatibleWritableRaster(targetW, targetH);
boolean alphaPremultiplied = cm.isAlphaPremultiplied();
target = new BufferedImage(cm, raster, alphaPremultiplied, null);
} else
target = new BufferedImage(targetW, targetH, type);
Graphics2D g = target.createGraphics();
//smoother than exlax:
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY );
g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));
g.dispose();
return target;
}
public static void saveImageAsJpg (String fromFileStr,String saveToFileStr,int width,int hight)
throws Exception {
BufferedImage srcImage;
// String ex = fromFileStr.substring(fromFileStr.indexOf("."),fromFileStr.length());
String imgType = "JPEG";
if (fromFileStr.toLowerCase().endsWith(".png")) {
imgType = "PNG";
}
// System.out.println(ex);
File saveFile=new File(saveToFileStr);
File fromFile=new File(fromFileStr);
srcImage = ImageIO.read(fromFile);
if(width > 0 || hight > 0)
{
srcImage = resize(srcImage, width, hight);
}
ImageIO.write(srcImage, imgType, saveFile);
}
public static void main (String argv[]) {
try{
//参数1(from),参数2(to),参数3(宽),参数4(高)
Test.saveImageAsJpg("E:/Document/My Pictures/3.gif","c:/6.gif",50,50);
} catch(Exception e)
{
e.printStackTrace();
}
}
}
方法2:
- importjava.io.*;
- importjava.util.*;
- importcom.sun.image.codec.jpeg.*;
- importjava.awt.image.*;
- importjava.awt.*;
- importjava.net.*;
- importjava.applet.*;
- importjava.sql.*;
- //缩略图类,
- //本java类能将jpg图片文件,进行等比或非等比的大小转换。
- //具体使用方法
- //s_pic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度,是否等比缩放(默认为true))
- publicclassTes{
- StringInputDir;//输入图路径
- StringOutputDir;//输出图路径
- StringInputFileName;//输入图文件名
- StringOutputFileName;//输出图文件名
- intOutputWidth=80;//默认输出图片宽
- intOutputHeight=80;//默认输出图片高
- intrate=0;
- booleanproportion=true;//是否等比缩放标记(默认为等比缩放)
- publicTes(){
- //初始化变量
- InputDir="";
- OutputDir="";
- InputFileName="";
- OutputFileName="";
- OutputWidth=80;
- OutputHeight=80;
- rate=0;
- }
- publicvoidsetInputDir(StringInputDir){
- this.InputDir=InputDir;
- }
- publicvoidsetOutputDir(StringOutputDir){
- this.OutputDir=OutputDir;
- }
- publicvoidsetInputFileName(StringInputFileName){
- this.InputFileName=InputFileName;
- }
- publicvoidsetOutputFileName(StringOutputFileName){
- this.OutputFileName=OutputFileName;
- }
- publicvoidsetOutputWidth(intOutputWidth){
- this.OutputWidth=OutputWidth;
- }
- publicvoidsetOutputHeight(intOutputHeight){
- this.OutputHeight=OutputHeight;
- }
- publicvoidsetW_H(intwidth,intheight){
- this.OutputWidth=width;
- this.OutputHeight=height;
- }
- publicStrings_pic(){
- BufferedImageimage;
- StringNewFileName;
- //建立输出文件对象
- Filefile=newFile(OutputDir+OutputFileName);
- FileOutputStreamtempout=null;
- try{
- tempout=newFileOutputStream(file);
- }catch(Exceptionex){
- System.out.println(ex.toString());
- }
- Imageimg=null;
- Toolkittk=Toolkit.getDefaultToolkit();
- Appletapp=newApplet();
- MediaTrackermt=newMediaTracker(app);
- try{
- img=tk.getImage(InputDir+InputFileName);
- mt.addImage(img,0);
- mt.waitForID(0);
- }catch(Exceptione){
- e.printStackTrace();
- }
- if(img.getWidth(null)==-1){
- System.out.println("can'tread,retry!"+"<BR>");
- return"no";
- }else{
- intnew_w;
- intnew_h;
- if(this.proportion==true){//判断是否是等比缩放.
- //为等比缩放计算输出的图片宽度及高度
- doublerate1=((double)img.getWidth(null))/
- (double)OutputWidth+0.1;
- doublerate2=((double)img.getHeight(null))/
- (double)OutputHeight+0.1;
- doublerate=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;//输出的图片高度
- }
- BufferedImagebuffImg=newBufferedImage(new_w,new_h,
- BufferedImage.TYPE_INT_RGB);
- Graphicsg=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();
- JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(tempout);
- try{
- encoder.encode(buffImg);
- tempout.close();
- }catch(IOExceptionex){
- System.out.println(ex.toString());
- }
- }
- return"ok";
- }
- publicStrings_pic(StringInputDir,StringOutputDir,StringInputFileName,
- StringOutputFileName){
- //输入图路径
- this.InputDir=InputDir;
- //输出图路径
- this.OutputDir=OutputDir;
- //输入图文件名
- this.InputFileName=InputFileName;
- //输出图文件名
- this.OutputFileName=OutputFileName;
- returns_pic();
- }
- publicStrings_pic(StringInputDir,StringOutputDir,StringInputFileName,
- StringOutputFileName,intwidth,intheight,
- booleangp){
- //输入图路径
- this.InputDir=InputDir;
- //输出图路径
- this.OutputDir=OutputDir;
- //输入图文件名
- this.InputFileName=InputFileName;
- //输出图文件名
- this.OutputFileName=OutputFileName;
- //设置图片长宽
- setW_H(width,height);
- //是否是等比缩放标记
- this.proportion=gp;
- returns_pic();
- }
- publicstaticvoidmain(String[]a){
- //s_pic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度)
- Tesmypic=newTes();
- System.out.println(
- mypic.s_pic("E:\Document\MyPictures\",
- "E:\Document\MyPictures\",
- "topbg-3.gif","3.gif",400,400,true)
- );
- }
- }