一. 直接添加图片,进行图片的压缩采样
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卡的;在清单文件中需要加入文件的读写权限