图片的压缩与二级采样

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

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卡的;在清单文件中需要加入文件的读写权限

你可能感兴趣的:(工程搭建)