Java实现缩略图的方法
?方法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分别表示目标长和宽
? 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:
? 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图片文件,进行等比或非等比的大小转换。
?//具体使用方法
?//s_pic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度,是否等比缩放(默认为true))
? public class Tes {
? String InputDir; //输入图路径
? String OutputDir; //输出图路径
? String InputFileName; //输入图文件名
? String OutputFileName; //输出图文件名
? int OutputWidth = 80; //默认输出图片宽
? int OutputHeight = 80; //默认输出图片高
? int rate = 0;
? boolean proportion = true; //是否等比缩放标记(默认为等比缩放)
?
? 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;
?//建立输出文件对象
? 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) { //判断是否是等比缩放.
?//为等比缩放计算输出的图片宽度及高度
? 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;
?//设置图片长宽
? setW_H(width, height);
?//是否是等比缩放 标记
? 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); //构造Image对象
? 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);//计算新图长宽
? 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();
?
?}
?
这个,到底是该用Jimi还是JAI啊? 5 楼 ray_linn 2011-03-02 JE帐号 写道ray_linn 写道直接用Jimi,略过上面的代码
这个,到底是该用Jimi还是JAI啊?
我觉得jimi好,不依赖X11库,独立发布没问题。只是sun不支持它了,不过凑合着用吧。 6 楼 siashuayongsheng 2011-03-02 图片大的话会不会导致内在溢出?