posts - 93,  comments - 2,  trackbacks - 0

          /**
          * @param 將字節數組轉換為ImageView可調用的Bitmap對象

           * @param bytes

           * @param opts

           * @return Bitmap

           */

           public static Bitmap getPicFromBytes(byte[] bytes, BitmapFactory.Options opts) {

               if (bytes != null)

                  if (opts != null
                       return BitmapFactory.decodeByteArray(bytes, 0, bytes.length,  opts); 
                  else

                      return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
               return null;

          }

          這里我們主要來介紹一個BitmapFactory.Options這個類
              

          BitmapFactory.Options這個類的詳解如下:

          public Bitmap

          inBitmap

          If set, decode methods that take the Options object will attempt to reuse this bitmap when loading content.

          public int

          inDensity

          The pixel density to use for the bitmap.

          public boolean

          inDither

          If dither is true, the decoder will attempt to dither the decoded image.

          public boolean

          inInputShareable

          This field works in conjuction with inPurgeable.

          public boolean

          inJustDecodeBounds

          If set to true, the decoder will return null (no bitmap), but the out…

          public boolean

          inMutable

          If set, decode methods will always return a mutable Bitmap instead of an immutable one.

          public boolean

          inPreferQualityOverSpeed

          If inPreferQualityOverSpeed is set to true, the decoder will try to decode the reconstructed image to a higher quality even at the expense of the decoding speed.

          publicBitmap.Config

          inPreferredConfig

          If this is non-null, the decoder will try to decode into this internal configuration.

          public boolean

          inPurgeable

          If this is set to true, then the resulting bitmap will allocate its pixels such that they can be purged if the system needs to reclaim memory.

          public int

          inSampleSize

          If set to a value > 1, requests the decoder to subsample the original image, returning a smaller image to save memory.

          public boolean

          inScaled

          When this flag is set, if inDensity and inTargetDensity are not 0, the bitmap will be scaled to match inTargetDensity when loaded, rather than relying on the graphics system scaling it each time it is drawn to a Canvas.

          public int

          inScreenDensity

          The pixel density of the actual screen that is being used.

          public int

          inTargetDensity

          The pixel density of the destination this bitmap will be drawn to.

          public byte[]

          inTempStorage

          Temp storage to use for decoding.

          public boolean

          mCancel

          Flag to indicate that cancel has been called on this object.

          public int

          outHeight

          The resulting height of the bitmap, set independent of the state of inJustDecodeBounds.

          public String

          outMimeType

          If known, this string is set to the mimetype of the decoded image.

          public int

          outWidth

          The resulting width of the bitmap, set independent of the state of inJustDecodeBounds.

          這個表格是從android sdk文檔里摘出來的,簡單看一下說明就明白是什么意思了。
          下面我們回到我們的主題上來:怎樣獲取圖片的大小?
          思路很簡單:
          首先我們把這個圖片轉成Bitmap,然后再利用Bitmap的getWidth()和getHeight()方法就可以取到圖片的寬高了。
          新問題又來了,在通過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就是我們想要的寬和高了。

          有了寬,高的信息,我們怎樣在圖片不變形的情況下獲取到圖片指定大小的縮略圖呢?
          比如我們需要在圖片不變形的前提下得到寬度為200的縮略圖。
          那么我們需要先計算一下縮放之后,圖片的高度是多少

          1. /* 計算得到圖片的高度 */
          2. /* 這里需要主意,如果你需要更高的精度來保證圖片不變形的話,需要自己進行一下數學運算 */
          3. int height = options.outHeight * 200 / options.outWidth;
          4. options.outWidth = 200;
          5. options.outHeight = height;
          6. /* 這樣才能真正的返回一個Bitmap給你 */
          7. options.inJustDecodeBounds = false;
          8. Bitmap bmp = BitmapFactory.decodeFile(path, options);
          9. image.setImageBitmap(bmp);

          復制代碼

          這樣雖然我們可以得到我們期望大小的ImageView
          但是在執行BitmapFactory.decodeFile(path, options);時,并沒有節約內存。
          要想節約內存,還需要用到BitmapFactory.Options這個類里的 inSampleSize 這個成員變量。
          我們可以根據圖片實際的寬高和我們期望的寬高來計算得到這個值。

          1. inSampleSize = options.outWidth / 200;

          另外,為了節約內存我們還可以使用下面的幾個字段:

          1. options.inPreferredConfig = Bitmap.Config.ARGB_4444;    // 默認是Bitmap.Config.ARGB_8888
          2. /* 下面兩個字段需要組合使用 */
          3. options.inPurgeable = true;
          4. options.inInputShareable = true;

              

          posted on 2013-05-29 11:36 Terry Zou 閱讀(2835) 評論(0)  編輯  收藏 所屬分類: Tomcat+Eclipse
          <2013年5月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          收藏夾

          Java

          搜索

          •  

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 贡觉县| 英吉沙县| 泾阳县| 南漳县| 金山区| 彰化县| 灵石县| 富顺县| 榆中县| 灵武市| 万安县| 旬阳县| 瑞丽市| 马关县| 镇原县| 和硕县| 南投县| 顺义区| 安图县| 华亭县| 昂仁县| 丰城市| 翼城县| 都匀市| 法库县| 宝鸡市| 扬州市| 灵台县| 庄河市| 尖扎县| 灯塔市| 商丘市| 铜鼓县| 崇左市| 定襄县| 高碑店市| 安溪县| 霍邱县| 桂林市| 雅安市| 横山县|