Imageloader<8>-压缩图片

简介: Imageloader<8>-压缩图片

通过采样率压缩图片的步骤:

  1. 将BitmapFactory.Options的inJustDecodeBounds参数设置为true并加载图片
  2. 从BitmapFactory.Options中取出图片的原始宽和高 ,分别对应outWidth和outHeight
  3. 根据采样率的就着并结合目标View的所需大小计算出采样率inSampleSize
  4. 将BitmapFactory.Options的inJustDecodeBounds参数设置为false,然后重新加载图片


BTW: 说一下BitmapFactory.Options的inJustDecodeBounds属性,当参数设置为true时,BitmapFactory只会解析图片的原始宽和高,并不会将图片加载到内存中。


 // 如果图片不存在 则添加到任务队列中
            addTask(new Runnable() {
                @Override
                public void run() {
                    // 加载图片 TODO
                    // 1.获取图片需要显示的宽和搞
                    ImageSize imageSize = getImageViewSize(imageView);
                    // 利用Options压缩图片
                    Bitmap bm = decodeSampledBitmapFromPath(path, imageSize.width, imageSize.height);
                    // 添加到LruCache中
                    addBitmapToLruCache(path, bm);
                    // 发送消息,通知UIHandler更新图片
                    ImageBeanHoler holder = new ImageBeanHoler();
                    holder.bitmap = getBitmapFromLruCache(path);
                    holder.imageView = imageView;
                    holder.path = path;
                    Message message = Message.obtain();
                    message.obj = holder;
                    mUIHandler.sendMessage(message);
                    // 执行完之后,释放一个信号量,通知mPoolThread可以从任务队列中获取下一个任务了去执行了。
                    mPoolThreadSemaphore.release();
                }
            });
/**
     * 根据计算的inSampleSize得到压缩的图片
     *
     * @param path
     * @param reqWidth
     * @param reqHeight
     * @return
     */
    private Bitmap decodeSampledBitmapFromPath(String path, int reqWidth, int reqHeight) {
        // 第一次解析将inJustDecodeBounds设置为true,不将图片加载到内存,获取图片的大小
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(path, options);
        // 计算inSampleSize
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
        // 使用获取到的inSampleSize再此获取图片,加载到内存中
        options.inJustDecodeBounds = false;
        Bitmap bitmap = BitmapFactory.decodeFile(path, options);
        return bitmap;
    }
    /**
     * 这个方法用户可以自己设置适合项目的图片比例
     *
     * @param options
     * @param reqWidth
     * @param reqHeight
     * @return
     */
    private int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // 源图片的宽度
        int width = options.outWidth;
        int height = options.outHeight;
        int inSampleSize = 1;
        if (width > reqWidth && height > reqHeight) // ||也是可以的,看实际情况
        {
            // 计算出实际宽度和目标宽度的比率
            int widthRatio = Math.round((float) width / (float) reqWidth);
            int heightRatio = Math.round((float) width / (float) reqWidth);
            inSampleSize = Math.max(widthRatio, heightRatio); // 为了节省内存,取了大值。如果有变形,取小值试试。
        }
        return inSampleSize;
    }
相关文章
|
3月前
|
缓存 监控 Java
在使用 Glide 加载 Gif 动画时避免内存泄漏的方法
【10月更文挑战第20天】在使用 Glide 加载 Gif 动画时,避免内存泄漏是非常重要的。通过及时取消加载请求、正确处理生命周期、使用弱引用、清理缓存和避免重复加载等方法,可以有效地避免内存泄漏问题。同时,定期进行监控和检测,确保应用的性能和稳定性。需要在实际开发中不断积累经验,根据具体情况灵活运用这些方法,以保障应用的良好运行。
|
前端开发 算法
一个有趣的图片加载效果
一个有趣的图片加载效果
114 0
|
缓存
Imageloader<7>-获取图片需要显示的大小
Imageloader<7>-获取图片需要显示的大小
110 0
|
缓存 Java
Imageloader<4>-ImageLoader中的变量
Imageloader<4>-ImageLoader中的变量
62 0
|
缓存 Java Android开发
Android使用LruCache、DiskLruCache实现图片缓存+图片瀑布流
**本文仅用于学习利用LruCache、DiskLruCache图片缓存策略、实现瀑布流和Matix查看大图缩放移动等功能,如果想用到项目中,建议用更成熟的框架,如[glide]
181 0
|
缓存 Android开发 异构计算
Glide、Picasso和Fresco
Glide、Picasso和Fresco
397 0
Glide、Picasso和Fresco
|
缓存
Picasso图片框架加载图片 使用及缓存问题
Picasso图片框架加载图片 使用及缓存问题
|
缓存 Android开发 设计模式
16.手写图片加载框架ImageLoader
概述 第三方开源的图片框架很多,这里自己去写一个的目的是通过这样一个写的过程,拓展自己对架构设计的理解,包括设计模式,线程,策略,缓存等等。另外大型的框架例如Glide,代码很完善,扩展性很高,但是阅读起来有难度,而实际上,这些框架底层实现原理都是类似的,所以通过构建一个简单框架的过程更加有助于对其原理的理解,算是为阅读复杂的第三方源码打下一个基础。
1142 0
|
Android开发
探索Glide对Gif图片资源的获取、解析过程
先预祝大家汤圆节快乐!很久没写博客了。今天我们来探索一下Glide是如何支持Gif图片加载的。 本篇博客的目的 了解代码分析的基本思路与方法 了解Glide是如何对Gif图片进行支持的 探索背景 为什么会有这么一个想法呢,一来一直对Glide是知其名而不知其所以然,二来还主要是工作中需要对它研究研究,以便更好的支持工作内容。
1536 0