zoukankan      html  css  js  c++  java
  • Android获取图片大小以及获取指定大小的缩略图

    怎样获取图片的大小?0 }# S! I5 g+ W
    思路很简单:
    首先我们把这个图片转成Bitmap,然后再利用Bitmap的getWidth()和getHeight()方法就可以取到图片的宽高了。
    & V  ~" k% W8 }& P  Z
    新问题又来了,在通过BitmapFactory.decodeFile(String path)方法将突破转成Bitmap时,遇到大一些的图片,我们经常会遇到OOM(Out Of Memory)的问题。怎么避免它呢?
    这就用到了我们上面提到的BitmapFactory.Options这个类。

    BitmapFactory.Options这个类,有一个字段叫做 inJustDecodeBounds 。SDK中对这个成员的说明是这样的:
    If set to true, the decoder will return null (no bitmap), but the out...

    也就是说,如果我们把它设为true,那么BitmapFactory.decodeFile(String path, Options opt)并不会真的返回一个Bitmap给你,它仅仅会把它的宽,高取回来给你,这样就不会占用太多的内存,也就不会那么频繁的发生OOM了。

    示例代码如下:

    1. BitmapFactory.Options options = new BitmapFactory.Options();
    2. options.inJustDecodeBounds = true;
    3. Bitmap bmp = BitmapFactory.decodeFile(path, options);
    4. /* 这里返回的bmp是null *
    这段代码之后,options.outWidth  和 options.outHeight就是我们想要的宽和高了。+ q, y! m! W$ U. L
    1 D/ M+ D3 b! I7 ~" Z7 c+ S
    有了宽,高的信息,我们怎样在图片不变形的情况下获取到图片指定大小的缩略图呢?' e7 o% M: y7 ~3 h7 M/ Z, L
    比如我们需要在图片不变形的前提下得到宽度为200的缩略图。& n: X) z3 z" `% u
    那么我们需要先计算一下缩放之后,图片的高度是多少. A
    int height = options.outHeight * 200 / options.outWidth;
    1. options.outWidth = 200;
    2. options.outHeight = height;' o+ E! m; f2 E  E1 {3 d
    3. /* 这样才能真正的返回一个Bitmap给你 */
    4. options.inJustDecodeBounds = false;
    5. Bitmap bmp = BitmapFactory.decodeFile(path, options);2 _) }# R8 J+ V* b
    6. image.setImageBitmap(bmp);
    这样虽然我们可以得到我们期望大小的ImageView' T9 ]: g5 g$ Y) l* A
    但是在执行BitmapFactory.decodeFile(path, options);时,并没有节约内存。
    要想节约内存,还需要用到BitmapFactory.Options这个类里的 inSampleSize 这个成员变量。
    我们可以根据图片实际的宽高和我们期望的宽高来计算得到这个值。
    inSampleSize = options.outWidth / 200;
     
    另外,为了节约内存我们还可以使用下面的几个字段:
    1. options.inPreferredConfig = Bitmap.Config.ARGB_4444;    // 默认是Bitmap.Config.ARGB_88887 i1 Z7 x; g6 t, _" P
    2. /* 下面两个字段需要组合使用 */6 O# Q" {! f8 a9 }& {% U0 d/ h
    3. options.inPurgeable = true;
    4. options.inInputShareable = true;
  • 相关阅读:
    什么样的代码称得上是好代码?
    九年程序人生 总结分享
    Docker入门 第一课 --.Net Core 使用Docker全程记录
    阿里云 Windows Server 2012 r2 部署asp.net mvc网站 平坑之旅
    Visual studio 2015 Community 安装过程中遇到问题的终极解决
    Activiti6.0 spring5 工作流引擎 java SSM流程审批 项目框架
    java 进销存 库存管理 销售报表 商户管理 springmvc SSM crm 项目
    Leetcode名企之路
    24. 两两交换链表中的节点
    21. 合并两个有序链表
  • 原文地址:https://www.cnblogs.com/nan325/p/3337455.html
Copyright © 2011-2022 走看看