论坛首页 Java企业应用论坛

Java实现缩略图的方法

浏览 3509 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2011-03-01   最后修改:2011-03-02

 方法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();
 
 }
 

   发表时间:2011-03-01  
..楼主稍微排版一下啊
0 请登录后投票
   发表时间:2011-03-02  
总感觉Java处理图片速度太慢,特别是200*20000这种类似的,或者大图,不知道楼主有什么好办法?
0 请登录后投票
   发表时间:2011-03-02  
直接用Jimi,略过上面的代码
0 请登录后投票
   发表时间:2011-03-02  
ray_linn 写道
直接用Jimi,略过上面的代码


这个,到底是该用Jimi还是JAI啊?
0 请登录后投票
   发表时间:2011-03-02  
JE帐号 写道
ray_linn 写道
直接用Jimi,略过上面的代码


这个,到底是该用Jimi还是JAI啊?



我觉得jimi好,不依赖X11库,独立发布没问题。只是sun不支持它了,不过凑合着用吧。
0 请登录后投票
   发表时间:2011-03-02  
图片大的话会不会导致内在溢出?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics