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

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

程序分为2部分:

实现标准封装ImageScale功能

代码块去测试和使用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 AffineTransformOp.TYPE_NEAREST_NEIGHBOR;

* "2" represents AffineTransformOp.TYPE_BILINEAR;

* "3" represents AffineTransformOp.TYPE_BICUBIC;

* @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等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值