java 图片翻转、缩小(压缩用到了AffineTransform和aAfineTransformOp类,其中AffineTransform用于做翻转、缩小工作,AffineTransformOp用于“包装”实现该动作。请看例子:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package affinetransform;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTabbedPane;
/**
16. * 使图片水平翻转、垂直翻转、旋转180度
17. *
18. * @author Administrator
19. */
public class TestPicture {
private static JFrame jframe = new JFrame();
private URL url =this.getClass().getResource("3.jpg");
public TestPicture(){
//sourceImage.getWidth(), sourceImage.getHeight());// 旋转180度
// System.out.println(url.getAuthority());
try {
//URL url=new URL("http://baile8410.iteye.com/images/login_icon.png");
BufferedImage sourceImage = ImageIO.read(url);
BufferedImage dstImage = null;
AffineTransform transform = new AffineTransform(1, 0, 0, -1, 0, sourceImage.getHeight()); // 翻转90度
AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
dstImage = op.filter(sourceImage, null);
transform = new AffineTransform(-1, 0, 0, -1, sourceImage.getWidth(), sourceImage.getHeight());// 旋转180度
op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
BufferedImage dstImage2 = op.filter(sourceImage, null);//180
transform = new AffineTransform(-1,0,0,1,sourceImage.getWidth(),0);//翻转270度
op = new AffineTransformOp(transform,AffineTransformOp.TYPE_BICUBIC);
BufferedImage dstImage3 = op.filter(sourceImage,null);
double radio = 0.5;//sourceImage.getWidth();
System.out.println(sourceImage.getWidth()+","+radio);
op = new AffineTransformOp(AffineTransform.getScaleInstance(radio, radio),null);//按0.5的比例缩小
BufferedImage dstImage4 = op.filter(sourceImage, null);
ImageIO.write(dstImage4,"jpg",new java.io.File("4.jpg"));//上传
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.add("Source Transform", new JLabel(new ImageIcon(sourceImage)));
tabbedPane.add("90度 Transform", new JLabel(new ImageIcon(dstImage)));
tabbedPane.add("180度 Transform", new JLabel(new ImageIcon(dstImage2)));
tabbedPane.add("270度 Transform", new JLabel(new ImageIcon(dstImage3)));
tabbedPane.add("270度 Transform", new panel());
tabbedPane.add("缩小 Transform", new JLabel(new ImageIcon(dstImage4)));
jframe.setSize(800, 600);
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.getContentPane().add(tabbedPane);
jframe.setVisible(true);
} catch (IOException ex) {
Logger.getLogger(TestPicture.class.getName()).log(Level.SEVERE, null, ex);
}
}
/** 获得文件的绝对地址 */
public static final URL getURL(String path) {
URL url ="".getClass().getResource(path);
System.out.println(url.getAuthority());
return url;
}
public static void main(String[] args) throws IOException {
new TestPicture();
}
/**
* @return the url
/**
* @param url the url to set
*/
public void setUrl(URL url) {
this.url = url;
}
}
AffineTransform用法:(m00,m10,m01,m11,m02,m22):
这样的坐标变换可以使用一个 3 行乘 3 列的矩阵来表示,最后一行默认为 [ 0 0 1 ]。此矩阵将源坐标 (x,y)
变换为目标坐标 (x',y')
,这一过程将坐标视为列向量,并用矩阵乘以坐标向量,步骤如下:
[ x'] [ m00 m01 m02 ] [ x ] [ m00x + m01y + m02 ] [ y'] = [ m10 m11 m12 ] [ y ] = [ m10x + m11y + m12 ] [ 1 ] [ 0 0 1 ] [ 1 ] [ 1 ]
构造函数 AffineTransform(m00,m10,m01,m11,m02,m22),因为3*3的最后一行是默认值[ 0,0,1],故在构造函数中省略了,只需要6个参数:m00,m10,m01,m11,m02,m22。设变换前坐标(x,y),变换后( x',y' ),结合数学几何关系不难得出以下关系:
翻转90度:x'=x, y'=height()-y;( x 不变)
翻转180度: x' = weight()-x , y' = height()-y;
翻转270度:x' = weight()-x , y' = y;( y不变)
缩小:代码很简单——
double r = 0.5 //缩小的比例(在0.0-1.0之间)
AffineTransformOp = new AffineTransformOp(AffineTransform.getScaleInstance(radio, radio),null);
BufferedImage img = op.filter(sourceImage,null);//得到“包装”后的image
//此后可以对“包装”后的BufferedImage进行很多其他操作了,如:
上传:
ImageIO.write(img,"jpg",new File(上传后要得到的图片文件路径));
或显示:
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.add("Source Transform", new JLabel(new ImageIcon(sourceImage)));//“Source Transform”按钮关联显示原图片的一层(上面放有JLabel对象)
tabbedPane.add("90度 Transform", new JLabel(new ImageIcon(dstImage)));//"90度 Transform"按钮关联显示旋转90度的图片的一层
tabbedPane.add("180度 Transform", new JLabel(new ImageIcon(dstImage2)));//...以此类推