图片二次采样

原创 2018年04月16日 18:54:05
public class MainActivity extends AppCompatActivity {

    private ImageView imageView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.btn_down);
        imageView = (ImageView) findViewById(R.id.img);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //加载一张大图时,显示不出来,需要进行二次采样
                new MyPicTask().execute("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1507587322735&di=f9178e70b29b4d4f3f99244700064d99&imgtype=0&src=http%3A%2F%2Fattachments.gfan.com%2Fforum%2F201606%2F24%2F2340578lqll23i231cn3i4.jpg");

            }
        });

    }



    /**
     * 使用异步任务请求图片
     */
    class MyPicTask extends AsyncTask<String, Void, Bitmap> {

        @Override
        protected Bitmap doInBackground(String... params) {
            Bitmap bitmap = null;
            try {
                //1.创建url对象
                URL url = new URL(params[0]);
                //2.打开连接
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                //3.设置
                connection.setRequestMethod("GET");
                connection.setConnectTimeout(5000);
                connection.setConnectTimeout(5000);
                //4.得到结果码,并且判断
                int code = connection.getResponseCode();
                if (code == 200) {
                    //5.得到结果
                    InputStream inputStream = connection.getInputStream();
                    //将流转换成Bitmap对象
//                    bitmap = BitmapFactory.decodeStream(inputStream);
                    bitmap=commpressPic(inputStream,320,320);

                }
            } catch (Exception e) {
                e.printStackTrace();
                if(e!=null){
                    Log.e("zzz",e.getMessage().toString());
                }

            }


            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            //显示图片
            imageView.setImageBitmap(bitmap);

        }
    }

    //图片的二次采样
    //1.原因:加载大质量图片时,为了避免OOM(内存溢出)异常
    //2.是什么? 对图片进行压缩
    //3.如何进行压缩? BitmapFactory  BitmapFactory.Options
    public Bitmap commpressPic(InputStream inputStream, int targetWidthPx, int targetHeightPx) {
        Bitmap result=null;
        BitmapFactory.Options options = new BitmapFactory.Options();
        //设置为true,只取得宽度与高度的数据,只加载边框
        options.inJustDecodeBounds=true;

        try {
            byte[] data=inputStream2ByteArr(inputStream);
            //进行转换
//        Bitmap bitmap=BitmapFactory.decodeStream(inputStream,null,options);
            Bitmap bitmap=BitmapFactory.decodeByteArray(data,0,data.length,options);
            Log.d("zzz","bitmap:"+bitmap);

            int picHeight=options.outHeight;
            int picWidth=options.outWidth;
            Log.d("zzz","图片实际的高度(px):"+picHeight+" 图片实际的宽度(px):"+picWidth);
            /////////////////////第一次采样完成(只加载图片的边框进来,获取图片实际的宽度与高度)////////////////////////////////////////////////////////
            //2500x1600  实际宽度与高度

            //320x320 目标宽度与高度
            //计算缩放比率
            int simpleSize=1;
            if(picHeight>targetHeightPx || picWidth>targetWidthPx){

                int heightRate=picHeight/targetHeightPx;
                int widthRate=picWidth/targetWidthPx;

                Log.d("zzz","heightRate:"+heightRate+" widthRate:"+widthRate);
                //选取两者之间最小的
                simpleSize=heightRate<widthRate?heightRate:widthRate;

                Log.d("zzz","simpleSize:"+simpleSize);
            }

            options.inSampleSize=simpleSize;//缩放比率 2  宽度压缩到1/2 高度压缩1/2    =====1/4
            options.inJustDecodeBounds=false;//加载实际的图片质量
            //设置图片色彩模式  rgb_565 一个像素在内存占两个字节   rgb_8888 一个像素在内存占四个字节
            options.inPreferredConfig= Bitmap.Config.RGB_565;


            //原因是decodeStream不能重复解析同一个网络流的inputStream
//        result=BitmapFactory.decodeStream(inputStream,null,options);
            result=BitmapFactory.decodeByteArray(data,0,data.length,options);
            Log.d("zzz","result:"+result);
            ////////////第二次采样结束(计算图片的压缩比率)/////////////////////////////////////////////////////////////////////
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    private byte[] inputStream2ByteArr(InputStream inputStream) throws Exception {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        byte[] buff = new byte[1024];
        int len = 0;
        while ( (len = inputStream.read(buff)) != -1) {
            outputStream.write(buff, 0, len);
        }
        inputStream.close();
        outputStream.close();
        return outputStream.toByteArray();
    }

}

Android中图片的二次采样示例

一.概述 在安卓系统中,照片的大小是根据摄像头的分辨率而定的,一般是分辨率X4,就是照片的大。由于安卓系统中规定照片大小不能超过16M,因此,如果直接将照片存入内存,会造成OOM(内存溢出),故采用...
  • FightFightFight
  • FightFightFight
  • 2015-11-10 19:36:41
  • 3082

图片的三级缓存和二次采样使用的案例

首先跟大家介绍一下三级缓存,当然缓存的好处就是可以让用户体验更好,缺点就是没有实时更新数据,但我们大部分应用都不需要实时更新,所以三级缓存运用面比较广的。 所谓三级缓存其实是一种加载图片文件的策略,简...
  • MR_Condingson
  • MR_Condingson
  • 2016-11-19 10:59:56
  • 993

Android开发之Bitmap二次采样

Bitmap二次采样,听着好像是一个高大上的事,其实也就那么回事,今天我们就来看看Bitmap的二次采样问题。1.为什么要二次采样OK,那么首先我要 解决的一个问题就是为什么我们要二次采样?不知道大家...
  • u012702547
  • u012702547
  • 2016-04-25 21:31:02
  • 9444

Android Bitmap二次采样,大图处理

Bitmap 二次采样: 二次采样的目的是将高分辨率的图片进行采样缩放。由于手机给每个APP分配的空间是有限的。所以若是不对图片进行缩放的话,就容易造成内存溢出(即OOM,out of memory...
  • Whatfizzer
  • Whatfizzer
  • 2017-02-22 15:21:03
  • 875

Bitmap二次采样,Android中的缓存处理及异步加载图片类的封装

Bitmap二次采样 一、二次采样: (一)、意义或目的:  1、用BitmapFactory解码一张图片时,有时会遇到该错误。这往往是由于图片过大造成的。要想正常使用,...
  • ElevenDGQ
  • ElevenDGQ
  • 2016-05-24 15:48:29
  • 1458

三级缓存,二次采样

Listview:性能优化 1:Listview是需要和适配器配合使用的, 常用的适配器有arrayAdapter,SimplerAdapter,SimpleCursorAdapter...
  • zhangxin0414
  • zhangxin0414
  • 2016-10-10 19:16:29
  • 696

android高级之图片二次采样

默认情况下,bitmap每个像素点占用4个字节(ARGB_8888),比如一张3543×3503的图片差不多在内存中占用47M,安卓系统给每个应用分配的内存都是有限的,可以使用Runtime.getR...
  • program008
  • program008
  • 2016-01-23 10:53:58
  • 942

图片的质量压缩和二次采样

二者的不同点 质量压缩:只会减少图片在sdcard中占的内存大小而不会改变运行内存不改变图片本身像素 二次采样:改变图片本身像素,减少加载图片的本身运行内存 上代码: 代码中注释都比较详细 ...
  • qiaoshi96_bk
  • qiaoshi96_bk
  • 2017-06-14 11:46:11
  • 519

Bitmap的二次采样

Bitmap可以理解为通过一个bit数组来存储特定数据的一种数据结构。 一,二次采样的意义和目的; 当网络访问加载图片的时候,我们会遇到OOM异常。这是因为图片过大产生的。想要正确使用则需要分配更少的...
  • yunlong_
  • yunlong_
  • 2015-12-22 11:51:25
  • 1986

Android---------二次采样和质量压缩

代码中写的很详细,直接上代码: XML布局中; xml version="1.0" encoding="utf-8"?> LinearLayout xmlns:android="http://...
  • leehbhs
  • leehbhs
  • 2017-10-11 19:34:38
  • 146
收藏助手
不良信息举报
您举报文章:图片二次采样
举报原因:
原因补充:

(最多只允许输入30个字)