方法1:[第一種方法比后一種生成的縮略圖要清晰]
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分別表示目標(biāo)長和寬
?int type = source.getType();
?BufferedImage target = null;
?double sx = (double) targetW / source.getWidth();
?double sy = (double) targetH / source.getHeight();
?//這里想實(shí)現(xiàn)在targetW,targetH范圍內(nèi)實(shí)現(xiàn)等比縮放。如果不需要等比縮放
?//則將下面的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{
?//參數(shù)1(from),參數(shù)2(to),參數(shù)3(寬),參數(shù)4(高)
?Test.saveImageAsJpg("E:/Document/My Pictures/3.gif","c:/6.gif",50,50);
?} catch(Exception e)
?{
?e.printStackTrace();
?}
?}
}
方法2:
?import java.io.*;
?import java.util.*;
?import com.sun.image.codec.jpeg.*;
?import java.awt.image.*;
?import java.awt.*;
?import java.net.*;
?import java.applet.*;
?import java.sql.*;
//縮略圖類,
//本java類能將jpg圖片文件,進(jìn)行等比或非等比的大小轉(zhuǎn)換。
//具體使用方法
//s_pic(大圖片路徑,生成小圖片路徑,大圖片文件名,生成小圖片文名,生成小圖片寬度,生成小圖片高度,是否等比縮放(默認(rèn)為true))
?public class Tes {
?String InputDir; //輸入圖路徑
?String OutputDir; //輸出圖路徑
?String InputFileName; //輸入圖文件名
?String OutputFileName; //輸出圖文件名
?int OutputWidth = 80; //默認(rèn)輸出圖片寬
?int OutputHeight = 80; //默認(rèn)輸出圖片高
?int rate = 0;
?boolean proportion = true; //是否等比縮放標(biāo)記(默認(rèn)為等比縮放)
?public Tes() {
//初始化變量
?InputDir = "";
?OutputDir = "";
?InputFileName = "";
?OutputFileName = "";
?OutputWidth = 80;
?OutputHeight = 80;
?rate = 0;
?}
?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 setW_H(int width, int height) {
?this.OutputWidth = width;
?this.OutputHeight = height;
?}
?public String s_pic() {
?BufferedImage image;
?String NewFileName;
//建立輸出文件對(duì)象
?File file = new File(OutputDir + OutputFileName);
?FileOutputStream tempout = null;
?try {
?tempout = new FileOutputStream(file);
?} catch (Exception ex) {
?System.out.println(ex.toString());
?}
?Image img = null;
?Toolkit tk = Toolkit.getDefaultToolkit();
?Applet app = new Applet();
?MediaTracker mt = new MediaTracker(app);
?try {
?img = tk.getImage(InputDir + InputFileName);
?mt.addImage(img, 0);
?mt.waitForID(0);
?} catch (Exception e) {
?e.printStackTrace();
?}
?if (img.getWidth(null) == -1) {
?System.out.println(" can't read,retry!" + "<BR>");
?return "no";
?} else {
?int new_w;
?int new_h;
?if (this.proportion == true) { //判斷是否是等比縮放.
//為等比縮放計(jì)算輸出的圖片寬度及高度
?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 "ok";
?}
?public String s_pic(String InputDir, String OutputDir, String InputFileName,
?String OutputFileName) {
//輸入圖路徑
?this.InputDir = InputDir;
//輸出圖路徑
?this.OutputDir = OutputDir;
//輸入圖文件名
?this.InputFileName = InputFileName;
//輸出圖文件名
?this.OutputFileName = OutputFileName;
?return s_pic();
?}
?public String s_pic(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;
//設(shè)置圖片長寬
?setW_H(width, height);
//是否是等比縮放 標(biāo)記
?this.proportion = gp;
?return s_pic();
?}
?public static void main(String[] a) {
//s_pic(大圖片路徑,生成小圖片路徑,大圖片文件名,生成小圖片文名,生成小圖片寬度,生成小圖片高度)
?Tes mypic = new Tes();
?System.out.println(
?mypic.s_pic("E:\\Document\\My Pictures\\",
?"E:\\Document\\My Pictures\\",
?"topbg-3.gif", "3.gif", 400, 400, true)
?);
?}
?}
3.jsp方式
java.io.*,java.awt.Image,java.awt.image.*,com.sun.image.codec.jpeg.*,
??try
????{
?java.io.File file = new java.io.File("E:\\Document\\My Pictures\\3.gif");
?String newurl="E:\\Document\\My Pictures\\32.gif"; //新的縮略圖保存地址
?Image src = javax.imageio.ImageIO.read(file); //構(gòu)造Image對(duì)象
?float tagsize=200;
?int old_w=src.getWidth(null); //得到源圖寬
?int old_h=src.getHeight(null);
?int new_w=0;
?int new_h=0; //得到源圖長
?int tempsize;
?float tempdouble;
?if(old_w>old_h){
?tempdouble=old_w/tagsize;
?}else{
?tempdouble=old_h/tagsize;
?}
?new_w=Math.round(old_w/tempdouble);
?new_h=Math.round(old_h/tempdouble);//計(jì)算新圖長寬
?BufferedImage tag = new BufferedImage(new_w,new_h,BufferedImage.TYPE_INT_RGB);
?tag.getGraphics().drawImage(src,0,0,new_w,new_h,null); //繪制縮小后的圖
?FileOutputStream newimage=new FileOutputStream(newurl); //輸出到文件流
?JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);
?encoder.encode(tag); //近JPEG編碼
?newimage.close();
}catch (Exception e){
e.toString();
}
posted on 2008-06-16 13:04
無聲 閱讀(1841)
評(píng)論(0) 編輯 收藏 所屬分類:
職場生活