• Android(java)学习笔记179:多媒体之加载大图片到内存(Bitmap API)


    1. Bitmap (API使用

    android里面的bitmap中,一个像素点需要4个byte去表示,这是因为android表示颜色是" argb ";其中 a 表示是透明度,然后是" rgb"

    颜色表示范围 00000000 ~~~ffffffff

    2. 加载图片到内存:

    上面说到了图形表示使用4byte,和int一样,所以Android里面每个像素点都是使用一个int来表示的。

    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.girl);
    iv = (ImageView) findViewById(R.id.iv);
    iv.setImageBitmap(bitmap);

    2. 加载大图片到内存:

    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.very_large_phone);
    iv = (ImageView) findViewById(R.id.iv);
    iv.setImageBitmap(bitmap);

    这里的图片very_large_phone非常大,1.69M(2560*1504);

    那么这个图片在Android中需要2560*1504*4 = 15400960 byte才能表示这张图片,结果或出现OOM(OUT OF MEMONY)内存溢出的错误。

    说明Android显示图片不是看图片自身的大小,而是看分辨率

    那么Android该怎么显示大图片(大分辨率)

    //为了避免oom异常,根据屏幕的尺寸对图片进行缩放

    //1.先获取手机屏幕的宽和高

    WindowManager  wm = (WindowManager)getSystemService( WINDOW_SERVICE );

    int  screenWidth  =  wm.getDefaultDisplay().getWidth();

    int  screenHeight = wm.getDefaultDisplay().getHeight();

    //2.获取图片的宽和高

    BitmapFactory.Options  opts = new Option();//创建一个配置参数

    opts.inJustDecodeBounds = true;//表示不真实地解析这个位图,只是解析位图的宽高信息(不申请空间解析这个图片,自然没有内存溢出

    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.very_large_phone,opts);

    int  width = opts.outWidth ;

    int  height = opts.outHeight ;

    //3.计算缩放的比例

    int scale = 1;

    int scaleX = width  / screenWidth;

    int scaleY = height / screenHeight;

    if(scaleX > scaleY && scaleY >1 ) {

         scale = scaleX ;

    }

    if(scaleY> scaleX && scaleX  >1 ) {

                   scale = scaleY ;

    }

    //4.根据缩放比例,真实解析位图

    opts.inSampleSize = scale;

    opts.inJustDecodeBounds = false;//真实地解析这个位图,返回bitmap;

     bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.very_large_phone,opts);//缩放后的bitmap

    iv.setImageBitmap(bitmap);

  • 相关阅读:
    .NET 操作XML
    C#常用操作类库五(电脑操作类)
    C#常用操作类库四(File操作类)
    C#常用操作类库一(验证类)
    RabbitMQ 学习
    redis 常用命令
    windows10配置redis一主二从三哨兵
    Oracle递归查询(查询当前记录所有父级或子级)
    echarts 中 柱图 、折线图、柱图层叠
    简单的前台登录
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4803449.html
Copyright © 2020-2023  润新知