图片压缩与缓存

  1 package com.wangzhen.util;

  2 

  3 import java.io.ByteArrayInputStream;

  4 import java.io.ByteArrayOutputStream;

  5 import java.io.IOException;

  6 import java.net.HttpURLConnection;

  7 import java.net.MalformedURLException;

  8 import java.net.URL;

  9 

 10 import android.annotation.SuppressLint;

 11 import android.graphics.Bitmap;

 12 import android.graphics.BitmapFactory;

 13 import android.graphics.Bitmap.CompressFormat;

 14 import android.os.Handler;

 15 import android.os.Message;

 16 import android.support.v4.util.LruCache;

 17 import android.util.Log;

 18 import android.widget.ImageView;

 19 import android.widget.ImageView.ScaleType;

 20 

 21 /**

 22  * 图片工具类

 23  * 

 24  * @author Administrator

 25  * 

 26  */

 27 public class ImageLoader {

 28 

 29     private static String mURL = "";

 30     private static ImageView mImageView;

 31     private LruCache<String, Bitmap> mCaches;// LruCache缓存算法

 32 

 33     public ImageLoader() {

 34         // 获取最大可用内存

 35         int MaxMemory = (int) Runtime.getRuntime().maxMemory();

 36         // 设置缓存可用空间

 37         int CacheSize = MaxMemory / 4;

 38         mCaches = new LruCache<String, Bitmap>(CacheSize) {

 39             @SuppressLint("NewApi")

 40             @Override

 41             protected int sizeOf(String key, Bitmap value) {

 42                 // 每次存入缓存的时候调用

 43                 return value.getByteCount();

 44             }

 45         };

 46     }

 47 

 48     /**

 49      * 将图片存入缓存

 50      * 

 51      * @param url

 52      * @param bitmap

 53      */

 54     private void AddBitmapToCache(String url, Bitmap bitmap) {

 55         if (GetBitmapFromCache(url) == null) {

 56             mCaches.put(url, bitmap);

 57         }

 58     }

 59 

 60     /**

 61      * 从缓存中取出图片

 62      * 

 63      * @param url

 64      * @return

 65      */

 66     private Bitmap GetBitmapFromCache(String url) {

 67         return mCaches.get(url);

 68     }

 69 

 70     /**

 71      * 以线程方式下载图片

 72      * 

 73      * @param imageView

 74      * @param path

 75      */

 76     public void GetImageByThread(ImageView imageView, String path) {

 77         mURL = path;

 78         mImageView = imageView;

 79         new Thread() {

 80             public void run() {

 81                 // 首先判断缓存中是否已存在当前图片

 82                 Bitmap bitmap = GetBitmapFromCache(mURL);

 83                 if (bitmap == null) {

 84                     bitmap = CompressBitmap(GetBitmapFromURL(mURL));

 85                     Message message = Message.obtain();

 86                     message.obj = bitmap;

 87                     mHandler.sendMessage(message);

 88                 } else {

 89                     mImageView.setImageBitmap(bitmap);

 90                 }

 91             };

 92         }.start();

 93     }

 94 

 95     /**

 96      * 通过URL获取图片

 97      * 

 98      * @return

 99      */

100     private Bitmap GetBitmapFromURL(String path) {

101         Bitmap bitmap = null;

102         try {

103             URL url = new URL(path);

104             HttpURLConnection connection = (HttpURLConnection) url

105                     .openConnection();

106             bitmap = BitmapFactory.decodeStream(connection.getInputStream());

107             connection.disconnect();

108         } catch (MalformedURLException e) {

109             // TODO Auto-generated catch block

110             e.printStackTrace();

111         } catch (IOException e) {

112             // TODO Auto-generated catch block

113             e.printStackTrace();

114         }

115         return bitmap;

116     }

117 

118     /**

119      * 图片压缩:质量压缩

120      * 

121      * @param bitmap

122      * @return

123      */

124     private Bitmap CompressBitmap(Bitmap bitmap) {

125         ByteArrayOutputStream baos = new ByteArrayOutputStream();

126         // 质量压缩方法,这里100表示不压缩,将压缩后的数据放入到baos中

127         bitmap.compress(CompressFormat.JPEG, 100, baos);

128         Log.i("Compress", "压缩前:" + baos.toByteArray().length / 1024 + "KB");

129         int options = 100;

130         while (baos.toByteArray().length / 1024 > 50) {

131             // 重置BAOS,即清空

132             baos.reset();

133             bitmap.compress(CompressFormat.JPEG, options, baos);

134             options -= 10;

135         }

136         Log.i("Compress", "压缩后:" + baos.toByteArray().length / 1024 + "KB");

137         // 将压缩后数据存放到ByteArrayInputStream中

138         ByteArrayInputStream is = new ByteArrayInputStream(baos.toByteArray());

139         // 把ByteArrayInputStream解码为图片

140         Bitmap image = BitmapFactory.decodeStream(is);

141         return image;

142     }

143 

144     Handler mHandler = new Handler() {

145         @SuppressLint("NewApi")

146         public void handleMessage(Message msg) {

147             Bitmap bitmap =(Bitmap) msg.obj;

148             AddBitmapToCache(mURL, bitmap);

149             mImageView.setImageBitmap(bitmap);

150             //按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽) 

151             mImageView.setScaleType(ScaleType.CENTER_CROP);

152         };

153     };

154 

155 }

 

你可能感兴趣的:(缓存)