图片的压缩与二级采样

来源:互联网 发布:工具制作软件 编辑:程序博客网 时间:2024/06/07 02:41

一. 直接添加图片,进行图片的压缩采样

1. 在MainActivity的主部分代码:

import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Environment;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.view.Window;import android.view.WindowManager;import android.widget.ImageView;public class MainActivity extends AppCompatActivity {    private ImageView image;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);        setContentView(R.layout.activity_main);        image = (ImageView) findViewById(R.id.image);    }    //图片二级采样的点击事件    public void erJiCaiYang(View view){//        //先给SD卡设置图片路径,方便下面获取图片//        Uri uri = Uri.parse(Environment.getExternalStorageDirectory() + "/abc.jpg");//        image.setImageURI(uri);        //再调用方法,获取并设置图片        Bitmap bitmap = getBitmap(Environment.getExternalStorageDirectory()+"/abc.jpg",320,480);        image.setImageBitmap(bitmap);    }    /**     * 二次采样 返回bitmap     * @param width     * @param height     * @param path     * option 选项     */    private Bitmap getBitmap(String path, int width, int height) {        //采用二次采样(缩小图片尺寸的方式)        //1.步骤1 获取原始图片的宽高信息,用于进行采样的计算        //1.1  创建Options ,给BitmapFactory的内部解码器设置参数        BitmapFactory.Options options = new BitmapFactory.Options();        //1.2  设置inJustDecodeBounds 来控制解码器,只会进行图片宽高的获取,即只会加载边框,不会获取图片        //不占用内存,当使用这个参数,代表BitmapFactory.decodexxx()不会返回bitmap        options.inJustDecodeBounds = true;        BitmapFactory.decodeFile(path,options);        //1.3 获取边框的宽高        int outWidth = options.outWidth;        int outHeight = options.outHeight;        //1.4 计算缩放的比例        int scaleX = outWidth / width;        final int scaleY = outHeight / height;        //1.5 初始化压缩的比例        int sampleSize = 1;        if (scaleX >scaleY && scaleY>1){            sampleSize =scaleX;        }else if (scaleY >scaleX && scaleX>1){            sampleSize = scaleY;        }        //2. 根据比例进行压缩,并且压缩图片的质量        options.inJustDecodeBounds = false;        //2.1 设置压缩的比例        options.inSampleSize = sampleSize;        //2.2 设置图片的质量  Bitmap.Config.RGB_565一个像素点在内存中占有2个字节...Bitmap.Config.ARGB_8888占有四个字节        options.inPreferredConfig = Bitmap.Config.RGB_565;        //以指定的选项解码图片,,,返回        return BitmapFactory.decodeFile(path,options);    }}

2. 在activity_main显示的代码:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="activity.a06_picture_erjicaiyang.MainActivity">    <Button        android:onClick="erJiCaiYang"        android:text="二级采样获取图片"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_horizontal"/>    <ImageView        android:id="@+id/image"        android:layout_marginTop="18dp"        android:layout_width="match_parent"        android:layout_height="match_parent" /></LinearLayout>


二. 输入图片的宽高和压缩质量,进行图片的压缩采样

1. 在MainActivity的主部分代码:

import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Environment;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;import android.widget.ImageView;public class MainActivity extends AppCompatActivity {    private EditText edit_width;    private EditText edit_height;    private EditText edit_weight;    private ImageView image;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        edit_width = (EditText) findViewById(R.id.edit_width);        edit_height = (EditText) findViewById(R.id.edit_height);        edit_weight = (EditText) findViewById(R.id.edit_weight);        image = (ImageView) findViewById(R.id.image);    }    //2.点击选择按钮,打开图库,从图库选择之后返回图片的路径    public void choose(View view){        //为SD卡设置图片路径        Uri uri = Uri.parse(Environment.getDownloadCacheDirectory() + "/abc.jpg");        image.setImageURI(uri);    }    //3.输入宽、高、压缩质量,点击生成按钮,进行二次采样处理    public  void  done(View view){        Bitmap bitmap = getBitmap(Environment.getExternalStorageDirectory()+"/abc.jpg",edit_width.getText().toString(),edit_height.getText().toString(),edit_weight.getText().toString());        image.setImageBitmap(bitmap);    }    /**     *4.设置只加载图片的宽高尺寸,和目标尺寸进行比较,每次缩放1/2的方式算出宽高缩放的倍数      5.设置加载图片的内容,将图片加载到缩放后的目标尺寸中去      6.将处理后的图片,按照设置的压缩质量进行输出      7.将最终的图片显示在下方的ImageView中。     * @param path     * @param width     * @param height     * @param weight     * @return     */    private Bitmap getBitmap(String path, String width, String height, String weight) {        //采用二次采样(缩小图片尺寸的方式)        //1.步骤1 获取原始图片的宽高信息,用于进行采样的计算        //1.1  创建Options ,给BitmapFactory的内部解码器设置参数        BitmapFactory.Options options = new BitmapFactory.Options();        //1.2 设置inJustDecodeBounds 来控制解码器,只会进行图片宽高的获取,即只会加载边框,不会获取图片        //不占用内存,当使用这个参数,代表BitmapFactory.decodexxx()不会返回bitmap        options.inJustDecodeBounds = true;        BitmapFactory.decodeFile(path,options);                //1.3 获取宽高        int outWidth = options.outWidth;        int outHeight = options.outHeight;        //1.4 计算缩放的比例        Integer valueOfwidth = Integer.valueOf(width);        Integer valueOfheight = Integer.valueOf(height);        int scaleX =outWidth/valueOfwidth;        int scaleY = outHeight / valueOfheight;        //1.5 初始化缩放的比例        int simpleSize = 1;        if (scaleX > scaleY && scaleY >1){            simpleSize = scaleX;        }else if (scaleY > scaleX & scaleX >1){            simpleSize = scaleY;        }        //2. 根据比例进行压缩,并且压缩图片的质量        options.inJustDecodeBounds = false;        //2.1 设置压缩的比例        options.inSampleSize = simpleSize;        //2.2 设置压缩的质量        options.inPreferredConfig = Bitmap.Config.RGB_565;        //将处理后的图片,按照设置的压缩质量进行输出        return BitmapFactory.decodeFile(path,options);    }}

2. 在activity_main显示的代码:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    android:padding="10dp"    tools:context="activity.CaiYang.MainActivity">    <Button        android:text="选择图片"        android:onClick="choose"        android:layout_width="300dp"        android:layout_height="wrap_content"        android:layout_gravity="center_horizontal"/>    <LinearLayout        android:orientation="horizontal"        android:layout_width="match_parent"        android:layout_height="wrap_content">        <TextView            android:text="宽"            android:layout_marginLeft="47dp"            android:layout_width="wrap_content"            android:layout_height="wrap_content" />        <EditText            android:id="@+id/edit_width"            android:layout_width="50dp"            android:layout_height="wrap_content" />        <TextView            android:text="高"            android:layout_marginLeft="35dp"            android:layout_width="wrap_content"            android:layout_height="wrap_content" />        <EditText            android:id="@+id/edit_height"            android:layout_width="50dp"            android:layout_height="wrap_content" />        <TextView            android:text="压缩质量"            android:layout_marginLeft="30dp"            android:layout_width="wrap_content"            android:layout_height="wrap_content" />        <EditText            android:id="@+id/edit_weight"            android:layout_width="50dp"            android:layout_height="wrap_content" />    </LinearLayout>    <Button        android:text="生成"        android:onClick="done"        android:layout_width="300dp"        android:layout_height="wrap_content"        android:layout_gravity="center_horizontal"/>    <ImageView        android:id="@+id/image"        android:layout_marginTop="20dp"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:layout_gravity="center_horizontal"/></LinearLayout>
说明:图片是自定义的,是需要自己使用DDMS导入SD卡的;在清单文件中需要加入文件的读写权限