Java 图像缩放程序
在写图像缩放程序之前,先介绍下流程
- 初始化程序:高度、宽度、缩放比例
- 图像缩放的三种类型:
(1)按缩放比例来缩放
(2)按给定高度来缩放
(3)按给定宽度来缩放 - 开始缩放图像
(1)先创建两个图片对象:输入和输出
(2)把读取源图像到缓冲区
(3)计算尺寸,目标图像尺寸写入缓存区
(4)求缩放图像的缩放比例,写入变换对象AffineTransform
(5)操作变换对象,实现从源图像到目标图像的变换
(6)把目标图像缓存区写入磁盘
(7)完成
package com.src.self;
/************【转换方法】********************/
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class JPGTransformer {
private boolean isInitFlag=false;//对象是否已经初始化
//定义目标图片的宽度和高度
private int targetPicWidth=0;
private int targetPicHeight=0;
private double picScale=0;//定义目标图片的相比图标的比例
//构造函数设置初始值
public JPGTransformer() {
this.isInitFlag=false;
}
//重置JPG图片缩放器
public void resetJPGTransformer() {
this.picScale=0;
this.targetPicHeight=0;
this.targetPicWidth=0;
this.isInitFlag=false;
}
//设置目标图片相对于原图片的缩放比例【根据缩放比例来缩放图片】
public void setPicScale(double scale) throws JPGException{
if(scale<=0) {
throw new JPGException("缩放比例不能为0和负数");
}
this.resetJPGTransformer();
this.picScale=scale;
this.isInitFlag=true;
}
//设置目标图片的宽度【根据宽度来设定缩放源图片】
public void SetSmallWidth(int width) throws JPGException{
if(width<=0) {
throw new JPGException("缩方图片的宽度不能为0和负数");
}
this.resetJPGTransformer();
this.targetPicWidth=width;
this.isInitFlag=true;
}
//设置目标图片的高度【根据高度来缩放源图片】
public void SetSmallHeight(int height) throws JPGException{
if(height<=0) {
throw new JPGException("缩放图片的高度不能为0和负数");
}
this.resetJPGTransformer();
this.targetPicHeight=height;
this.isInitFlag=true;
}
/**
* 开始缩放图片
* @param srcPicFileName 原图片的文件名
* @param targetPicFileName 目标图片的文件名
* @throws JPGException 异常信息
*/
public void transform(String srcPicFileName,String targetPicFileName) throws JPGException{
if(!this.isInitFlag) {
throw new JPGException("参数对象没有初始化");
}
if(srcPicFileName==null || targetPicFileName==null) {
throw new JPGException("包含文件名的路径为空!");
}
if((!srcPicFileName.toLowerCase().endsWith("jpg")) && (!srcPicFileName.toLowerCase().endsWith("jpeg"))) {
throw new JPGException("只能处理JPEG/JPG文件");
}
if((!targetPicFileName.toLowerCase().endsWith("jpg"))&&(!targetPicFileName.toLowerCase().endsWith("jpeg"))) {
throw new JPGException("只能处理JPEG/JPG文件");
}
//新建源图片和生成图片的文件对象
File fin=new File(srcPicFileName);
File fout=new File(targetPicFileName);
BufferedImage bSrc=null;//通过缓冲读入源图片
try {
//读取生成的图片
bSrc=ImageIO.read(fin);
}catch(IOException ex) {
throw new JPGException("读取源文件出错");
}
//获取原图片的宽度和高度
int srcW=bSrc.getWidth();
int srcH=bSrc.getHeight();
int targetW=0;
int targetH=0;
if(this.targetPicWidth!=0) {
//根据设定的宽度求出长度
targetW=this.targetPicWidth;
targetH=(targetW*srcH)/srcW;
}else if(this.targetPicHeight!=0) {
//根据设定的长度求出宽度
targetH=this.targetPicHeight;
targetW=(targetH*srcW)/srcH;
}else if(this.picScale!=0) {
//根据设置的缩放比例求出长和宽
targetW=(int)((float) srcW*this.picScale);
targetH=(int)((float) srcH*this.picScale);
}else {
throw new JPGException("对象初始化参数不正确");
}
System.out.println("原图片的的分辨率:"+srcW+"X"+srcH);
System.out.println("目标图片的分辨率:"+targetW+"X"+targetH);
//目标图像的缓冲对象
BufferedImage bTarget=new BufferedImage(targetW, targetH, BufferedImage.TYPE_3BYTE_BGR);
//求得目标图片与源图片宽度,高度的比例;
double sx=(double) targetW/srcW;
double sy=(double) targetH/srcH;
AffineTransform transform=new AffineTransform();//构造图像变换对象
transform.setToScale(sx, sy);//设置图像转换比例
//构造图像转换操作对象
AffineTransformOp ato=new AffineTransformOp(transform, null);
ato.filter(bSrc, bTarget);//实现变换,将bSrc 转换成 bTarget
try {
ImageIO.write(bTarget, "jpeg", fout);
}catch(IOException ex1) {
throw new JPGException("写入缩略图像文件出错");
}
}
public static void main(String[] args) throws JPGException{
JPGTransformer jpg=new JPGTransformer();
jpg.setPicScale(0.5);
String srcFileName="E:/JavaSe/Images/hszs_13.jpg";
String targetFileName="E:/JavaSe/Images/news.jpg";
jpg.transform(srcFileName, targetFileName);
}
}
/*******************【转换可能发生的异常信息】*******************************/
package com.src.self;
import java.lang.Exception;
public class JPGException extends Exception{
public JPGException(String msg) {
super(msg);
}
public JPGException(Exception e) {
super(e);
}
public JPGException(Throwable t) {
super(t);
}
public JPGException(String msg,Throwable t) {
super(msg,t);
}
}
备注:数据先写入缓冲区,可以减少读取原始数据的次数,提高效率