96编辑器旗下产品
找图
终身
ID:0
到期时间:永久
退出登录
您的位置:首页 > 百科管理 > 详情

android图片压缩框架-Android图片视频拍摄选取及压缩框架

原创:找图网 2023-04-14 06:00:42
  • Android黑科技,图片终极压缩

  • 一、支持自定义配置、不失真和批量处理

    二、图片上传为什么要压缩

    1、图片服务器空间限制,磁盘昂贵

    2、网络不稳定,大文件需要断点续传

    3、尽可能避免安卓OOM异常

    4、后台约定的规则<200KB

    5、需要上传原图的应用有医院临床项目、金融银行

    三、图片压缩流程

    1、递归每张图片

    2、设置图片格式

    png, jpg,webp

    3、质量压缩(format,quality,baos)

    由于png是无损压缩,所以设置quality无效(不适合作为缩略图)

    采样率压缩

    缩小图片分辨率,减少所占用磁盘空间和内存大小

    缩放压缩(bitmap, null,rectF,null)

    减少图片的像素,降低所占用磁盘空间大小和内存大小,可用于缓存缩略图

    JNI调用JPEG库

    Android的图片引擎使用的是阉割版的skia引擎,去掉了图片压缩中的哈夫曼算法

    4、像素修复

    5、返回压缩

    6、完成压缩

    demo:

    参考:

    Luban框架

    缺点

    1、当没有设定压缩路径时,抛异常无闪退

    2、源码中,压缩比率固定值60,无法修改

    3、压缩配置,参数不太适应真实项目需求

    4、不能指定压缩大小,比如100KB以内

  • Android图片视频拍摄选取及压缩框架

  • 图片选择库并压缩 PictureSelector

    视频压缩 VideoCompressor

    知识来源

  • Android图片框架对比

  • 对比现在主流图片框架的优势和缺点,在实际项目中如何选择适合自己的框架;

    Glide、Fresco、Picasso、ImageLoader

    共同优点:

    以上名词介绍

    在分析他们的差异、优缺点之前,我们先了解图片缓存通用的概念:

    以上概念在不同框架之间可能不同,比如Displayer在ImageLoader中叫做ImageAware,在Picasso和Glide中叫做Target。

    以上为Glide的总体设计图。

    整个库分为RequestManager(请求管理器)、Engine(数据获取引擎)、Fetcher(数据获取器)、MemoryCache(内存缓存)、DiskLRUCache(本地缓存)、Transformation(图片处理)、Encoder(编码处理)、Registry(图片类型以及解析器配置)、Target(目标)等模块。

    简单流程:

    Glider收到加载及显示资源任务,创建Request并将它交给RequestManager,Request启动Engine去数据源获取资源,得到资源后通过Transformation处理后交给Target.

    Glide依赖DiskLRUCache、GifDecoder等开源库去完成本地缓存和Gif图片解密工作;

    为Bitmap 维护一个BitmapPool对象池, 对象池的主要目的是通过减少大对象的分配以重用来提高性能!

    缺点

    :

    ①图片质量低:因为机制不同,速度快,但是图片的质量降低了RGB565;

    ②多尺寸缓存导致内存和磁盘占用多:根据ImageView大小来缓存,可能会导致一张图片可能根据展示情况来缓存不同尺寸的几份;

    扩展理解参考:

    以上为Picasso的总体设计图。

    整个库分为Dispatcher、RequestHandler以及Downloader、PicassoDrawable等模块。

    简单流程:

    Picasso收到加载显示图片任务后,创建Request并将它交给Dispatcher,Dispatcher分发任务到具体RequestHandler,任务通过MemoryCache及Handler(数据获取接口)获取图片,图片获取成功后通过PicassoDrawable显示到Target中;

    上面Data的File system部分,Picasso没有自定义本地缓存的接口,默认使用http的本地缓存,API19以上使用okhttp,一下使用UrlConnection,所以如果需要自定义本地缓存就需要自定义Downloader;

    缺点

    :加载速度没有其他框架快;

    特点

    :只缓存一个全尺寸的图片,根据需求的大小在压缩转换;

    以上为Fresco的总体设计图

    整个库分为UI:DraweeView(View控件)、Drawable(图片数据)、DraweeController(图片控制器)、DraweeHiierarchy(图片体系);Core:DataSource(数据源)、ImagePipeline(图像管道)、Producer(生产者)、ProducerFacotry(生产工厂)、Subcriber(订阅)、Supplier(供应者)、Consumer(消费者);IO/Data:MemoryCache(内存缓存)、Network、DiskCache(磁盘缓存)、Recourse(本地资源)

    简单流程:

    从上面的结构可以看出,fresco主要采用了工厂+建造者的模式实现功能,逻辑划分比较清楚;Fresco框架整体是一个MVC模式,DrawableView--->View用来显示顶层视图、DrawableController--->Control控制加载图片的配置 事件的分发、DrawableHierarchy--->Model 用于存储和描述图片信息,同时也封装了一些图片的显示和视图层级的方法;ImagePipeline模块负责从网络、本地文件系统、本地资源加载图片

    缺点:

    ①框架大,影响Apk体积;

    ②一定的学习成本,使用比较繁琐,需要使用内部提供的ImageView控件,使用起来比较复杂;

    最新文章 更多
    最新素材 更多
    公司介绍 网站地图 图片资讯
    Copyright © 2010-2022 山东找图网络科技有限公司  鲁ICP备18007836号-3  邮箱:15653358549@163.com