您的位置:首页 > 其它

图片的二次采样

2017-12-04 20:53 260 查看
  @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        img = (ImageView) findViewById(R.id.img);

        //sd..bb.jpg 1024*768 2M

        //320*320分辨率

        //得到sd卡上图片的路径

        sdPicSdPath = Environment.getExternalStorageDirectory().getPath()+"/img/bb.jpg";

        //运行时权限的判断

        int i = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);

        if(i!= PackageManager.PERMISSION_GRANTED){//此权限没有被授权

            //申请权限-弹出对话框

            ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},100);

        }else {//已经授权

            Bitmap bitmap= compassPic(sdPicSdPath,320,320);

            img.setImageBitmap(bitmap);

        }

    }

    //处理用户的授权结果

    @Override

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        //ctrl+alt+f  提取成全局变量

        if(requestCode==100){

            if(grantResults!=null && grantResults[0]==PackageManager.PERMISSION_GRANTED){

                Bitmap bitmap= compassPic(sdPicSdPath,320,320);

                img.setImageBitmap(bitmap);

            }else {

                Toast.makeText(MainActivity.this,"被拒绝了!",Toast.LENGTH_SHORT).show();

            }

        }

    }

    //二次采样-加载sd卡的图片

    /**

     *

     * @param picPath sd上图片的路径

     * @param widthPx 期望图片压缩的宽度 px

     * @param heightPx 期望图片压缩后的高度 px

     * @return

     */

    public Bitmap compassPic(String picPath,int widthPx,int heightPx){

        //第一次采样:主要是要拿到原图片的宽度与高度

        //第二次采样:计算采样率,进行压缩

        ///////////////////////////start 01/////////////////////////////////////

        BitmapFactory.Options options=new BitmapFactory.Options();

        options.inJustDecodeBounds=true;//设置成true,只拿图片的边框

        BitmapFactory.decodeFile(picPath,options);//根据图片,转换成Bitmap对象

        //得到图片的宽度与高度

        int outWidth = options.outWidth;

        int outHeight = options.outHeight;

        ///////////////////////////end 01/////////////////////////////////////

        //压缩率

        int sampleRate=1;

        if(outWidth>widthPx || outHeight>heightPx){

            int widthSample = outWidth / widthPx;

            int heightSample=outHeight/heightPx;

            //计算采样率

            sampleRate=widthSample>heightPx?widthSample:heightSample;

        }

        options.inJustDecodeBounds=false;//第二次设置成false

        options.inPreferredConfig= Bitmap.Config.RGB_565;//设置图片的色彩模式  1px=2字节  ARGB_8888  1px=4字节

        //最后得到的结果

        Bitmap bitmap=BitmapFactory.decodeFile(picPath,options);

        return bitmap;

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: