JAVA实现图像缩放(通过 java.awt.geom的仿射变换结合java.awt.image的各种插值方法实现)

JAVA实现图像缩放(通过 java.awt.geom的仿射变换结合java.awt.image的各种插值方法实现)。

程序分为2部分:

  1. 实现标准封装ImageScale功能
  2. 代码块去测试和使用ImageScale类的效果,以及对其中RGB元素通过移位手段的提取
package com.han;

import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;

public class ImageScale {
	
	/**
	 * It is designed for scaling images. Developed by Gaowen HAN.
	 * @param in the source image
	 * @param sx the width scale ratio
	 * @param sy the height scale ratio
	 * @param interpolationType "1" represents <code>AffineTransformOp.TYPE_NEAREST_NEIGHBOR</code>; 
	 *                          "2" represents <code>AffineTransformOp.TYPE_BILINEAR</code>; 
	 *                          "3" represents <code>AffineTransformOp.TYPE_BICUBIC</code>; 
	 * @return the scaled image
	 */
	public static BufferedImage scale(BufferedImage in, 
			double sx, 
			double sy, 
			int interpolationType){
		AffineTransform matrix=new AffineTransform(); //仿射变换
		matrix.scale(sx,sy);
		AffineTransformOp op = null;
		if (interpolationType==1){
			op=new AffineTransformOp(matrix, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
		}else if (interpolationType==2){
			op=new AffineTransformOp(matrix, AffineTransformOp.TYPE_BILINEAR);
		}else if (interpolationType==3){
			op=new AffineTransformOp(matrix, AffineTransformOp.TYPE_BICUBIC);
		}else{
			try {
				throw new Exception("input interpolation type from 1-3 !");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		int width = (int)((double)in.getWidth() * sx);
		int height = (int)((double)in.getHeight() * sy);
		BufferedImage dstImage = new BufferedImage(width, height, in.getType());
		//System.out.println(in.getType());
		//BufferedImage dstImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
		//BufferedImage out=op.filter(in, dstImage);
		op.filter(in, dstImage);
		//注意下面的代码不同, 结果背景颜色不同
		//BufferedImage out=op.filter(in, null);
		return dstImage;
	}
}


对上面标准封装的使用和测试,以及通过移位来提取单个像素或者图像某一特定区域的经过包装过的RGB值。

package com.han;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class Test_ImageScale {
	public static void main(String[] args){
		BufferedImage in;
		try {
			in = ImageIO.read(new File("C:/Users/HAN/Pictures/1_gaowen_han.jpg"));
			long   t1   =   System.currentTimeMillis(); //设定时间,以便可以比较各种不同插值的效率与系统开销
			BufferedImage out=ImageScale.scale(in, 4, 4, 3);//进行图像缩放
			long   t2   =   System.currentTimeMillis(); 
			//写出结果图片到电脑硬盘
			boolean b=ImageIO.write(out, "jpg", new File("C:/Users/HAN/Pictures/scale_gaowen_han.jpg"));
			System.out.println(b);
			System.out.println(t2-t1);
			System.out.println("Width : "+out.getWidth()+"\n"+"Height : "+out.getHeight());	
		
/*			int pixel=out.getRGB(0, 0);
			int R=(pixel & 0xff0000)>>16;
			int G=(pixel & 0xff00)>>8;
			int B=(pixel & 0xff);
			System.out.println("pixel R : "+R);
			System.out.println("pixel G : "+G);
			System.out.println("pixel B : "+B);*/
			/**********对缩放后的图像的像素RGB的提取********************/
			// 1. 直接进行单个元素的提取
			// 2. 进行图像中一块特定区域的像素提取
			// 3. 分别输出,进行比较以验证数学运算公式的正确性
			int startX=0;
			int startY=0;
			int offset=0;
			int scansize=10;
			int[] rgbArray=out.getRGB(startX, startY, 10, 10, null, offset, scansize);
			int x=8;
			int y=8;
			int pixel=out.getRGB(x, y);
			int pixel_prime  = rgbArray[offset + (y-startY)*scansize + (x-startX)]; 
			int R,G,B;
			R=(pixel & 0xff0000)>>16;
			G=(pixel & 0xff00)>>8;
			B=(pixel & 0xff);
			/*反之,由RGB分量也可以得到包装的颜色值
			int rbg = (255 << 24) | (r << 16) | (g << 8 )| b;*/
			System.out.println("pixel R : "+R);
			System.out.println("pixel G : "+G);
			System.out.println("pixel B : "+B);
			R=(pixel_prime & 0xff0000)>>16;
			G=(pixel_prime & 0xff00)>>8;
			B=(pixel_prime & 0xff);
			System.out.println("pixel R : "+R);
			System.out.println("pixel G : "+G);
			System.out.println("pixel B : "+B);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

有了像素的提取,使得能够像Matlab,Mathematica,IDL那样自己编写卫星照片处理等程序。当然JAVA中有自己的很多优秀封装库可以直接引用,比如JAVA Advanced Image Processing等。

posted on 2011-12-30 03:01  java课程设计例子  阅读(411)  评论(0编辑  收藏  举报