Java 图像缩放程序

Java 图像缩放程序
在写图像缩放程序之前,先介绍下流程

  1. 初始化程序:高度、宽度、缩放比例
  2. 图像缩放的三种类型:
    (1)按缩放比例来缩放
    (2)按给定高度来缩放
    (3)按给定宽度来缩放
  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);
	}
}	

备注:数据先写入缓冲区,可以减少读取原始数据的次数,提高效率

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值