java 后台老板图片缩放

java 后台图片缩放
缩略图实现,将图片(jpg,gif,bmp等等)真实的变成想要的大小
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 Small_pic{
String InputDir; //输入图路径
String OutputDir; //输出图路径
String InputFileName; //输入图文件名
String OutputFileName; //输出图文件名
int OutputWidth=80; //默认输出图片宽
int OutputHeight=80; //默认输出图片高
int rate=0;
boolean proportion=true; //是否等比缩放标记(默认为等比缩放)

public Small_pic(){
//初始化变量
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(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度)
Small_pic mypic =new Small_pic();
System.out.println(
mypic.s_pic("E:\\JAVA\\J2EEDatum\\王亮jsp资料\\缩图例子\\personal\\",
"E:\\JAVA\\J2EEDatum\\酒剑仙jsp资料\\缩图例子\\personal\\",
"1.jpg","new1.jpg",80,80,true)
);
}
}
---------------------------------------------------------------------------------------
图片上传到服务器后,会根据情况将图片缩小成一个图标,我们可以利用java强大的图形处理功能,对上传的图片进行缩放处理.
下面的程序使用jdk1.4中最新的ImageIO对图片进行读写.使用AffineTransform对图片进行缩放.

import java.io.File;
import java.awt.image.BufferedImage;
import java.awt.Image;
import java.awt.image.AffineTransformOp;
import javax.imageio.ImageIO;
import java.awt.geom.AffineTransform;
public class UploadImg{

/**
* @param fromdir 图片的原始目录
* @param todir 处理后的图片存放目录
* @param imgfile 原始图片
* @param sysimgfile 处理后的图片文件名前缀
*
*/ 

............................ 


public boolean CreateThumbnail() throws Exception
{
//ext是图片的格式 gif JPG 或png
String ext="";
double Ratio=0.0;
File F = new File(fromdir,imgfile);
if (!F.isFile())
throw new Exception(F+" is not image file error in CreateThumbnail!");

//首先判断上传的图片是gif还是JPG ImageIO只能将gif转换为png
if (isJpg(imgfile)){
ext="jpg";
}else{
ext="png"; 
}
File ThF = new File(todir,sysimgfile+"."+ext); 


BufferedImage Bi = ImageIO.read(F);
//假设图片宽 高 最大为120 120
Image Itemp = Bi.getScaledInstance (120,120,Bi.SCALE_SMOOTH);


if ((Bi.getHeight()>120) || (Bi.getWidth()>120)){
if (Bi.getHeight()>Bi.getWidth())
Ratio = 120.0/Bi.getHeight();
else
Ratio = 120.0/Bi.getWidth();
}


AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(Ratio, Ratio), null);
Itemp = op.filter(Bi, null);
try {
ImageIO.write((BufferedImage)Itemp, ext, ThF);
}catch (Exception ex) {
throw new Exception(" ImageIo.write error in CreatThum.: "+ex.getMessage()); 
}
return (true);
}
}
该程序使用了Java 的AWT,在linux下运行可能报错,有两种解决方式:
(1) jdk1.4以前版本:需要安装 XFree86和XFree86-Xvfb ,加入 export DISPLAY=hostdomain:0.0
(2) jdk 1.4以后版本,执行命令java 加入参数-Djava.awt.headless=true,表示这是一个没有键盘 没有显示器的无头服务器,意称机房托管的服务器。
-------------------------------------------------------
//缩略图实现,将图片(jpg,gif,bmp等等)真实的变成想要的大小
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 DwindlePic{
      String InputDir; //输入图路径
      String OutputDir; //输出图路径
      String InputFileName; //输入图文件名
      String OutputFileName; //输出图文件名
  int OutputWidth = 80; //默认输出图片宽
  int OutputHeight = 80; //默认输出图片高
  int rate = 0;
  boolean proportion = true; //是否等比缩放标记(默认为等比缩放)
 
  public DwindlePic() {
    //初始化变量
        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(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度)
        DwindlePic mypic = new DwindlePic();
        System.out.println(
            mypic.s_pic("e:\\Tomcat\\webapps\\pms\\image\\",
                        "e:\\Tomcat\\webapps\\pms\\image\\",
                        "test.jpg", "new.jpg", 120, 80, true)
            );
      }
*/
}