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 }