图片压缩与缓存

  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 }
时间: 2024-11-12 17:11:32

图片压缩与缓存的相关文章

android内存优化之图片压缩和缓存

由于手机内存的限制和网络流量的费用现在,我们在加载图片的时候,必须要做好图片的压缩和缓存. 图片缓存机制一般有2种,软引用和内存缓存技术. 1.压缩图片:压缩图片要既不能模糊,也不能拉伸图片. 图片操作的时候,最常用的是BitmapFactory,现在看看如何压缩图片. Bitmapfactory.Options options= new BitmapFactory.Options(); options.inJustDecodeBounds = true;// 如果设置这个参数为ture,就不会

Android图片下载以及缓存框架

实际开发中进行图片下载以及缓存的框架 介绍一下开发中常见图片加载框架的使用和对比一下优缺点. 1.Picasso 框架 在Android中开发,常需要从远程获取图片并显示在客户端,当然我们可以使用原生HttpURLConnection和AsyncTask等操作来完成,但并不推荐,因为这样不仅需要我们编写大量的代码, 还需要处理缓存和下载管理等,最好自己封装成库或者采用第三方库: 使用HttpUrlConnection和AsyncTask实现远程图片下载: 使用HttpUrlConnection和

功能这么齐全的图片压缩类,还有谁?

效果图: 压缩日志 com.pengkv.moon I/--->: 原尺寸:1215*1080 com.pengkv.moon I/--->: 最终压缩比例:3倍/新尺寸:405*360 工具特点 * 可以解析单张图片 * 可以解析多张图片 * 处理了压缩过程中OOM * 处理了部分手机照片旋转问题 * 压缩后存储在缓存中,并可以清理 * 压缩后返回缓存路径,方便上传 * 可以从缓存路径读取出Bitmap,方便展示 * 封装在2个类里,方便调用 使用方法 ImageCompressUtil.c

图片压缩之处理小图片压缩策略

在进行图片压缩的时候.有时候会碰到要压缩的图片尺寸小于指定的压缩尺寸,若直接压缩会导致图片失真. 当然.最好的方式是挑选合适尺寸图片进行上传. 这里给出的方法是:对不足尺寸部分进行空白填充. 详细參见下面代码 using System; using System.Drawing.Drawing2D; using System.Drawing; using System.IO; using System.Drawing.Imaging; namespace CommonLib { public c

为类似朋友圈的需求所做的图片压缩处理

1 package com.goalwisdom.gwnis.util.imgCompress; 2 import java.io.*; 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.awt.*; 6 import java.awt.image.*; 7 import javax.imageio.ImageIO; 8 9 import com.goalwisdom.gwnis.base.ServerCon

Android开发中图片的三级缓存策略

一.简介 现在的Android应用程序中,不可避免的都会使用到图片,如果每次加载图片的时候都要从网络重新拉取,这样不但很耗费用户的流量,而且图片加载的也会很慢,用户体验很不好.所以一个应用的图片缓存策略是很重要的.通常情况下,Android应用程序中图片的缓存策略采用"内存-本地-网络"三级缓存策略,首先应用程序访问网络拉取图片,分别将加载的图片保存在本地SD卡中和内存中,当程序再一次需要加载图片的时候,先判断内存中是否有缓存,有则直接从内存中拉取,否则查看本地SD卡中是否有缓存,SD

Android中图片的三级缓存策略

一.简介 现在的Android应用程序中,不可避免的都会使用到图片,如果每次加载图片的时候都要从网络重新拉取,这样不但很耗费用户的流量,而且图片加载的也会很慢,用户体验很不好.所以一个应用的图片缓存策略是很重要的.通常情况下,Android应用程序中图片的缓存策略采用"内存-本地-网络"三级缓存策略,首先应用程序访问网络拉取图片,分别将加载的图片保存在本地SD卡中和内存中,当程序再一次需要加载图片的时候,先判断内存中是否有缓存,有则直接从内存中拉取,否则查看本地SD卡中是否有缓存,SD

一:Java使用google的thumbnailator工具对图片压缩水印等做处理

Thumbnailator是一个非常好的图片开源工具 使用方法: 在pom中加入以下jar包 <!-- 图片缩略图 图片压缩 水印 start--> <dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version></dependency><!-- 图

apache压缩和缓存

apache 压缩 源码包挂载,解压(可参考博客LAMP) 解压源码包和组件包到目录/opt 将二个组件包放入代码包中 安装环境包 配置 编译,安装(make,make install) 将主配置文件建立软链接 ! 进入配置文件开启功能模块 过滤器 请求头部 重启服务,关闭防火墙,增强型功能 在客户端安装抓包工具fidder,测试 加入图片测试 apache缓存 和压缩模块一样,增加一个缓存模块--enable-expires,编译,安装. 对配置文件建立软链接,并且配置 开启功能,设置缓存时间