使用options对象进行二次采样

xiaoxiao2021-02-28  16

使用options对象进行二次采样,程序效果图:

结构图:

activity_main.xml:

<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"> <ImageView android:id="@+id/iv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> </LinearLayout>

MainActivity.java:

import java.io.InputStream; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.widget.ImageView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView iv = (ImageView) findViewById(R.id.iv); //创建一个显示矩阵 DisplayMetrics metrics = new DisplayMetrics(); //把屏幕的宽高放如该矩阵中 getWindowManager().getDefaultDisplay().getMetrics(metrics); //从显示矩阵中把屏幕宽高获取出来 int width = metrics.widthPixels; int height = metrics.heightPixels; Log.i("=======================", width + "-----" + height); try { // 目的:通过任何方式 能获取到图片的输入流就行 InputStream is = getAssets().open("aaa.jpg"); BitmapFactory.Options options = new BitmapFactory.Options(); // 把options中的inJustDecodeBounds参数设置成true代表 只获取图片的基本信息(头信息) // 基本信息中 包括图片的描述 例如 宽高 图片格式 大小 options.inJustDecodeBounds = true; // 使用处理图片的工厂类 可以吧 图片的数据流变成Bitmap图片资源 // 二次采样 使用options对象进行二次采样的过程 那么图片的头信息 都会保存到options对象中 BitmapFactory.decodeStream(is, null, options); int bmWidth = options.outWidth; int bmHeight = options.outHeight; //使用屏幕和图片的宽高 可以计算一个图片的显示大小 int scaleX = bmWidth/width; int scaleY = bmHeight/height; if(scaleX >= scaleY && scaleX >= 1){ options.inSampleSize = scaleX * 2; } if(scaleY >= scaleX && scaleY >= 1){ options.inSampleSize = scaleY * 2; } Log.i("=======================", bmWidth + "-----" + bmHeight + "------" + options.inSampleSize); options.inJustDecodeBounds = false; //宽高都缩小4倍 总内存会减少 4*4 = 16倍 // options.inSampleSize = 4; Bitmap bm = BitmapFactory.decodeStream(is, null, options); iv.setImageBitmap(bm); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
转载请注明原文地址: https://www.6miu.com/read-200059.html

最新回复(0)