zoukankan      html  css  js  c++  java
  • Android缩放图片和旋转图片示例 .

    一、完成该功能要具备以下知识点

    得到位图Bitmap的方式我总结了四种方式,不管哪种方式得到的图片相关的位图,
    都可以用ImageView对象的setImageBitmap(Bitmap bitmap)函数,把与位图相关的图片设置在ImageView中显示出来
    (1)从sdcard中图片路径去取,本例就是采取这种方式 ,如下面的代码,
    filename代表图片的路径
    Bitmap bm = BitmapFactory.decodeFile(fileName);
    (2)从项目的/res/drawable中去取
    Bitmap bm = ((BitmapDrawable)getResources().getDrawable(R.drawable.icon)).getBitmap();

    java.io.InputStream is = getResources().openRawResource(R.drawable.icon);
    BitmapFactory.Option opts = new BitmapFactory.Options();
    opts.inSampleSize = 2;
    Bitmap bitmap = BitmapFactory.decodeStream(is,null,opts);
    (3)从布局文件中的ImageView中去取 (以下代码中imageView是一个ImageView对象,该对象中已经设置了图片)
    BitmapDrawable bitmapDrawable = (BitmapDrawable) imageView.getDrawable();
    Bitmap bitmap = bitmapDrawable.getBitmap();
    (4)从socket中去取
    socket读取出的图片内容保存到byte数组中(假设byte数组名是 b,并且b的长度与图片内容长度相等)
    Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length);

    二、Android改变位图(图片)大小

    如果想改变图片的大小,可以先得到图片的位图对象后,改变位图大小,再设置到ImageView中去,
    本编讲的是怎样改变位图的大小示例,该示例把位图放大了1/4
    (假设bm是位图Bitmap对象, iv是ImageView对象,int curDegrees = 0)
    int bmpW = bm.getWidth();
    int bmpH = bm.getHeight();
    //设置图片放大比例
     double scale = 1.25;
     //计算出缩放比例的比例
     int scaleW = 1;
     int scaleH = 1;
     scaleW = (float)(scaleW*scale);
     scaleH = (float)(scaleH*scale);
     //产生reSize后的Bitmap对象
     android.graphics.Matrix mt = new android.graphics.Matrix();
     mt.postScale(scaleW, scaleH);
     Bitmap resizeBmp = Bitmap.createBitmap(bm, 0, 0, bmpW, bmpH, mt, true);

    三、旋转图片

    (以下示例是把图片放大四分之一再旋转,假设bm是位图Bitmap对象, iv是ImageView对象,int curDegrees = 0)
    int bmpW = bm.getWidth();
    int bmpH = bm.getHeight();
    //设置图片放大比例
    double scale = 1.25;
    //计算出这次要放大的比例
    int scaleW = 1;
    int scaleH = 1;
    scaleW = (float)(scaleW*scale);
    scaleH = (float)(scaleH*scale);
    //产生reSize后的Bitmap对象
     android.graphics.Matrix mt = new android.graphics.Matrix();
    //设置位图缩放比例
    mt.postScale(scaleW, scaleH);
    //设置位图旋转程度
    mt.setRotate(curDegrees = curDegrees + 5);
    //设置例设置好的位图缩放比例与旋转程度改变位图
    Bitmap resizeBmp = Bitmap.createBitmap(bm, 0, 0, bmpW, bmpH, mt, true);
    //把位图显示到ImageView中去
    iv.setImageBitmap(resizeBmp);

    四、下面做一个完整的示例,功能是可以缩放图片也可以旋转图片?

    1、第一步:
    布局文件/res/layout/main.xml内容
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="fill_parent"
        android:layout_height="fill_parent">
       
        <TextView android:layout_width="fill_parent"
            android:layout_height="wrap_content" android:text="" />
           
        <ImageView android:id="@+id/ImageView1"
            android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView>
           
        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="fill_parent"
        android:layout_height="wrap_content">
           
            <Button android:id="@+id/Button1"
            android:text="缩小"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:layout_marginTop="200px"></Button>
           
            <Button android:id="@+id/Button2"
            android:text="放大"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:layout_toRightOf="@id/Button1"
            android:layout_marginLeft="30px"
            android:layout_alignTop="@id/Button1"></Button>
           
            <Button android:id="@+id/Button3"
            android:text="左旋"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:layout_toRightOf="@id/Button2"
            android:layout_marginLeft="30px"
            android:layout_alignTop="@id/Button1"></Button>

            <Button android:id="@+id/Button4"
            android:text="右旋"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:layout_toRightOf="@id/Button3"
            android:layout_marginLeft="30px"
            android:layout_alignTop="@id/Button1"></Button>
        </RelativeLayout>
    </LinearLayout>

    2、第二步
    java代码
    package com.fs.com;

    import java.io.File;

    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Matrix;
    import android.graphics.drawable.BitmapDrawable;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.Toast;

    //ImageView、Bitmap、BitmapFactory以及Matrix的使用
    public class MainActivity extends Activity {
       
        private ImageView iv;

       //图片自己在相应目录下加上就行了
        private String fileName = "/sdcard/qq.JPG";//   
        private Button zoomOutBtn;//缩小按钮
        private Button zoomInBtn;//放大按钮
       
        private Button rotateLeftBtn;//左转按钮
        private Button rotateRightBtn;//右转按钮
       
        private Bitmap bm;//图片资源Bitmap
       
        private float scaleW = 1;//横向缩放系数,1表示不变
        private float scaleH = 1;//纵向缩放系数,1表示不变
       
        private float curDegrees = 0;//当前旋转度数
       
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
           
            iv = (ImageView)findViewById(R.id.ImageView1);
            zoomOutBtn = (Button)findViewById(R.id.Button1);
            zoomInBtn = (Button)findViewById(R.id.Button2);
           
            rotateLeftBtn = (Button)findViewById(R.id.Button3);
            rotateRightBtn = (Button)findViewById(R.id.Button4);
           
            File f = new File(fileName);
            if(f.exists()){
                //此外,你还可以使用BitmapFactory的decodeResource方法获得一个Bitmap对象
                //使用decodeResource方法时传入的是一个drawable的资源id
                //还有一个decodeStream方法,这个方法传入一个图片文件的输入流即可!
                bm = BitmapFactory.decodeFile(fileName);
                //设置ImageView的显示图片
                iv.setImageBitmap(bm);
            }else{
                Toast.makeText(this, "文件不存在!", Toast.LENGTH_SHORT).show();
            }
           
            //缩小按钮事件处理
            zoomOutBtn.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    small();
                }
            });
           
            //放大按钮事件处理
            zoomInBtn.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    big();
                }
            });
           
            //左转按钮事件处理
            rotateLeftBtn.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    left();
                }
            });
           
            //右转按钮事件处理
            rotateRightBtn.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    right();
                }
            });
        }
       
      //缩小事件处理
        private void small(){
            //根据getWidth和getHeight方法获取Bitmap资源的宽和高
            int bmpW = bm.getWidth();
            int bmpH = bm.getHeight();
            //设置图片缩小比例
            double scale = 0.8;
            //计算出这次要缩小的比例
            scaleW = (float)(scaleW*scale);
            scaleH = (float)(scaleH*scale);
           
            //产生reSize后的Bitmap对象
            //注意这个Matirx是android.graphics底下的那个
            Matrix mt = new Matrix();
            //设置缩放系数,分别为原来的0.8和0.8
            //如果设置为1,1,则是原来的尺寸
            mt.postScale(scaleW, scaleH);
           
            //根据缩放系数把原来的Bitmap资源bm进行缩放
            //参数一为原来的Bitmap资源bm
            //参数二和三为Bitmap所处的左上角坐标位置
            //参数四和五为原来Bitmap资源bm的宽和高
            //参数六为缩放系数参数
            //参数七为是否过滤
            //得到缩放后的Bitmap位图资源
            Bitmap resizeBmp = Bitmap.createBitmap(bm, 0, 0, bmpW, bmpH, mt, true);
           
            //重新设置ImageView显示的Bitmap位图资源图片
            iv.setImageBitmap(resizeBmp);
        }
       
        //放大事件处理
        private void big(){
            int bmpW = bm.getWidth();
            int bmpH = bm.getHeight();
            //设置图片放大比例
            double scale = 1.25;
            //计算出这次要放大的比例
            scaleW = (float)(scaleW*scale);
            scaleH = (float)(scaleH*scale);
           
            //产生reSize后的Bitmap对象
            //注意这个Matirx是android.graphics底下的那个
            Matrix mt = new Matrix();
            mt.postScale(scaleW, scaleH);
            Bitmap resizeBmp = Bitmap.createBitmap(bm, 0, 0, bmpW, bmpH, mt, true);
           
            iv.setImageBitmap(resizeBmp);
        }
       
        //左转事件处理
        private void left(){
         ImageView imageView = null;
            int bmpW = bm.getWidth();
            int bmpH = bm.getHeight();
            //设置图片放大比例
            double scale = 1;
            //计算出这次要放大的比例
            scaleW = (float)(scaleW*scale);
            scaleH = (float)(scaleH*scale);
            //产生reSize后的Bitmap对象
            //注意这个Matirx是android.graphics底下的那个
            Matrix mt = new Matrix();
            mt.postScale(scaleW, scaleH);
            //设置旋转角度
            //如果是设置为0则表示不旋转
            //设置的数是负数则向左转
            //设置的数是正数则向右转
            mt.setRotate(curDegrees = curDegrees-5);
            Bitmap resizeBmp = Bitmap.createBitmap(bm, 0, 0, bmpW, bmpH, mt, true);
           
            iv.setImageBitmap(resizeBmp);
        }
       
        //右转事件处理
        private void right(){
            int bmpW = bm.getWidth();
            int bmpH = bm.getHeight();
            //设置图片放大比例
            double scale = 1;
            //计算出这次要放大的比例
            scaleW = (float)(scaleW*scale);
            scaleH = (float)(scaleH*scale);
           
            //产生reSize后的Bitmap对象
            //注意这个Matirx是android.graphics底下的那个
            Matrix mt = new Matrix();
            mt.postScale(scaleW, scaleH);
            mt.setRotate(curDegrees = curDegrees + 5);
            Bitmap resizeBmp = Bitmap.createBitmap(bm, 0, 0, bmpW, bmpH, mt, true);
           
            iv.setImageBitmap(resizeBmp);
        }
    }

  • 相关阅读:
    【数据分析】Superset 之一 准备
    MapReduce 中的两表 join 几种方案简介
    How MapReduce Works
    SpringMVC介绍之约定优于配置
    HDFS中JAVA API的使用
    MapReduce程序的工作过程
    Hadoop 学习总结之一:HDFS简介
    海量数据的二度人脉挖掘算法(Hadoop 实现)
    MapReduce源码分析总结
    mapreduce实现"浏览该商品的人大多数还浏览了"经典应用
  • 原文地址:https://www.cnblogs.com/ggzjj/p/2856685.html
Copyright © 2011-2022 走看看