最近自己的任务做完,看项目中有做缩略图的,然后自己在网上看了看关于这方面的东西,参考网上的代码做了个demo,经过自己的实验,发现可用,特来记录一下
具体代码如下
//
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import java.io.File;
public class Test1 {
//生成缩略图
public static void saveImageAsJpg(String fromFileStr,String saveToFileStr,int width,int hight){
BufferedImage srcImage = null;
//设置图片的格式
String imgType="JPEG";
//用于判断图片的格式是否是png的,如果是把图片的类型转成png格式
if(fromFileStr.toLowerCase().endsWith(".png")){
imgType="PNG";
}
File fromFile = new File(fromFileStr);
File saveFile = new File(saveToFileStr);
try {
//返回BufferedImage作为供给的解码结果
srcImage = ImageIO.read(fromFile);
}catch (Exception e){
e.printStackTrace();
}
if(width>0|| hight>0){
srcImage = resize(srcImage,width,hight);
}
try {
//使用支持给定格式的任意imageWriter写入图像到file
ImageIO.write(srcImage, imgType, saveFile);
}catch (Exception e){
e.printStackTrace();
}
}
//将源图片的sufferedImage对象生成缩略图
public static BufferedImage resize(BufferedImage source,int targetW,int targetH){
int type = source.getType();
BufferedImage target = null;
double sx = (double)targetW/source.getWidth();
double sy = (double)targetH/source.getHeight();
//实现等比例缩放
if(sx>sy){
sx = sy;
targetW = (int)(sx*source.getWidth());
}else {
sy = sx;
targetH = (int)(sx*source.getHeight());
}
//当类型是自定义图像
if(type==BufferedImage.TYPE_CUSTOM){
//返回一个ColorModel
ColorModel cm = source.getColorModel();
//创建WritableRaster具有指定的宽度和高度,其具有的数据布局与此兼容ColorModel
WritableRaster raster = cm.createCompatibleWritableRaster(targetW,targetH);
//返回alpha8是否被这个ColorModel要翻译的像素值ColorModel
boolean alphaPremultiplied = cm.isAlphaPremultiplied();
//构造一个新的BufferedImage与指定的ColorModel和Raster
target = new BufferedImage(cm,raster,alphaPremultiplied,null);
}
else
//构造一个BufferedImage义的图像类型的一个BufferedImage
target =new BufferedImage(targetW,targetH,type);
//创建一个Graphics2D,可以用来绘制这个BufferedImage
Graphics2D g=target.createGraphics();
//为渲染算法设置单个首选项的值
//RenderingHints.KEY_RENDERING呈现提示键
//RenderingHints.VALUE_RENDER_QUALITY 渲染提示值——选择渲染算法以优化输出质量
g.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);
//渲染一个RenderableImage,在绘制之前将图像空间的变换应用到用户空间中
g.drawRenderedImage(source,AffineTransform.getScaleInstance(sx,sy));
//释放资源,因为不能命令gc回收
g.dispose();
return target;
}
public static void main(String args[]){
Test1.saveImageAsJpg("E:\\2.jpg","E:\\3.jpg",100,100);
}
}