java 图片翻转、缩小(压缩)

     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)));//...以此类推

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值