import java.io.*;
import java.lang.*;
import java.awt.*;
import java.awt.image.*;
import com.sun.image.codec.jpeg.*;
public class ResizeImg
{
 private String srcFile;
 private String destFile;
 private int w;
 private int h;
 private Image img;
 
 /**
  * 构造函数
  * @param filename 原图片名称 
  * @param resizefilename 新图片名称
  * @throws IOException
  */
 public ResizeImg(String filename,String resizefilename) throws IOException
 {
  File _file = new File(filename); //读入文件
     this.srcFile = _file.getName();
     this.destFile = resizefilename;
     img = javax.imageio.ImageIO.read(_file); //构造Image对象
     w = img.getWidth(null); //得到源图宽
     h = img.getHeight(null); //得到源图长
 }
 /**
  * 缩略图–剪切方法
  * @param x  新图的长
  * @param y  新图的高
  * @return
  */public boolean cutImg(int x, int y)
   {
   float factor = getCutFactor(x,y);
   if((int)(factor)>1)
    factor =1;
   int new_x = (int)(w*factor);
   int new_y = (int)(h*factor);
   if(w<x)
    new_x = w;
   if(h<y)
    new_y = h;
  
   int start_x = (x-new_x)/2;
   int start_y = (y-new_y)/2;
  
   BufferedImage _image = new BufferedImage(x,y,BufferedImage.TYPE_INT_RGB);
    Graphics g = _image.getGraphics();
    g.setColor(Color.WHITE);
    g.fillRect(0,0,x,y);
    //System.out.println(factor);
    //System.out.println(w+"-"+h+"-"+new_x+"-"+new_y+"-"+start_x+"-"+start_y);
    //以原始大小在新图上画旧图,以偏移坐标为偏移,从而得到旧图的中间部分
    if(g.drawImage(img,start_x,start_y,new_x,new_y,null))
    {
     FileOutputStream out;
     try {
     out = new FileOutputStream(destFile);
     JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
     try {
      encoder.encode(_image);
      out.close();
     } catch (ImageFormatException e) {
      // TODO 自动生成 catch 块
      e.printStackTrace();
      return false;
     } catch (IOException e) {
      // TODO 自动生成 catch 块
      e.printStackTrace();
      return false;
     } //近JPEG编码
     
    } catch (FileNotFoundException e) {
     // TODO 自动生成 catch 块
     e.printStackTrace();
     return false;
    } //输出到文件流
    }
    else
    {
     return false;
    }
   return true;
    
   }
  /**缩略图-压缩方法
  * @param x
  * @param y
  * @return
  */
 public boolean resize(int x,int y)
  {
   float factor = getFactor(x,y);
   int new_x = (int)(w*factor);
   int new_y = (int)(h*factor);
   if(w<x)
    new_x = w;
   if(h<y)
    new_y = h;
   int start_x = (x-new_x)/2;
   int start_y = (y-new_y)/2;
  
  
   BufferedImage _image = new BufferedImage(x,y,BufferedImage.TYPE_INT_RGB);
    Graphics g = _image.getGraphics();
    g.setColor(Color.WHITE);
    g.fillRect(0,0,x,y);
    //以new_x,new_y为大小在x,y大的图片上,从start_x,start_y开始画图
    if(g.drawImage(img,start_x,start_y,new_x,new_y,null))
    {
     FileOutputStream out;
     try {
     out = new FileOutputStream(destFile);
     JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
     try {
      encoder.encode(_image);
      out.close();
     } catch (ImageFormatException e) {
      // TODO 自动生成 catch 块
      e.printStackTrace();
      return false;
     } catch (IOException e) {
      // TODO 自动生成 catch 块
      e.printStackTrace();
      return false;
     } //近JPEG编码
     
    } catch (FileNotFoundException e) {
     // TODO 自动生成 catch 块
     e.printStackTrace();
     return false;
    } //输出到文件流
    }
    else
    {
     return false;
    }
   return true;
  }
  /**返回小的比例因子
  * @param x
  * @param y
  * @return
  */
 public float getFactor(int x,int y)
  {
   if((w/x)>(h/y))
    return (float)x/w;
   else
    return (float)y/h;
  }
  /**
   * 返回大的比例因子
   * @param x
   * @param y
   * @return
   */public float getCutFactor(int x,int y)
  {
   if((w/x)>(h/y))
    return (float)y/h;
   else
    return (float)x/w;
  }
   /**
    * 获取目标文件名
    * getDestFile
    */
   public String getDestFile() {
     return destFile;
   }
   /**
    * 获取图片原始宽度
    * getSrcWidth
    */
   public int getSrcWidth() {
     return w;
   }
   /**
    * 获取图片原始高度
    * getSrcHeight
    */
   public int getSrcHeight() {
     return h;
   }
   public static void main(String[] args)
   {
    ResizeImg ri = null;
  try {
   ri = new ResizeImg("RR1_T7DeWDLqELA0.jpg","RR1_T7DeWDLqELA0_thumbnail.jpg");
   ri.resize(500,500);
  } catch (IOException e) {
   // TODO 自动生成 catch 块
   e.printStackTrace();
  }
   
   }
}


评论

该日志第一篇评论

发表评论

评论也有版权!