{"id":13644084,"url":"https://github.com/hss01248/ImageLoader","last_synced_at":"2025-04-21T06:33:01.087Z","repository":{"id":41579844,"uuid":"84933058","full_name":"hss01248/ImageLoader","owner":"hss01248","description":" a wrapper for glidev4, a solution for image load and big image preview,  debug tool for imageview. image spiders on Android","archived":false,"fork":false,"pushed_at":"2024-04-09T09:03:07.000Z","size":11849,"stargazers_count":236,"open_issues_count":2,"forks_count":60,"subscribers_count":13,"default_branch":"master","last_synced_at":"2024-04-09T10:51:43.651Z","etag":null,"topics":["fresco","glide","glidev4","imageloader","spider"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hss01248.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2017-03-14T09:55:40.000Z","updated_at":"2024-05-30T08:01:14.461Z","dependencies_parsed_at":"2023-09-22T13:07:29.987Z","dependency_job_id":"7218afd3-288c-4cf1-9791-a76c18f91f7c","html_url":"https://github.com/hss01248/ImageLoader","commit_stats":null,"previous_names":[],"tags_count":99,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hss01248%2FImageLoader","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hss01248%2FImageLoader/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hss01248%2FImageLoader/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hss01248%2FImageLoader/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hss01248","download_url":"https://codeload.github.com/hss01248/ImageLoader/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250008294,"owners_count":21359961,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fresco","glide","glidev4","imageloader","spider"],"created_at":"2024-08-02T01:01:57.332Z","updated_at":"2025-04-21T06:32:56.078Z","avatar_url":"https://github.com/hss01248.png","language":"Java","readme":"# ImageLoader\n\n图片加载框架的api封装\n\n\n\n## 特点\n\n* api设计参考glide,链式调用\n* 目前底层依赖fresco和glide,picasso,直接gradle改一下就切换了\n* 能够以同样api获取bitmap,所设置的宽高,高斯模糊,圆角或圆形效果均生效.\n* 解决了fresco最新版中,获取到的bitmap是recycled,不能用的问题\n* 基于subsampling-scale-image-view的大图预览功能,带进度和失败状态,能轮播,极致的高清无码,更重要的是非常省内存,绝不泄漏\n* 丰富便捷的api: 暂停和继续图片加载,获取磁盘缓存大小和清空缓存,响应内存事件等等.\n* 可以设置placeHolder,loadingDrawable,errorHolder,并且均可以自定义其scaleType.\n\n## TODO \n* 自动识别gif并加载\n* 适配wrap_centent\n* 适配focus_face\n\n[![](https://jitpack.io/v/hss01248/ImageLoader.svg)](https://jitpack.io/#hss01248/ImageLoader)\n\n```\ncom.github.hss01248.ImageLoader:MediaStoreApi:3.4.7\ncom.github.hss01248.ImageLoader:imageloader:3.4.7\ncom.github.hss01248.ImageLoader:avif:3.4.7\ncom.github.hss01248.ImageLoader:compressor:3.4.7\ncom.github.hss01248.ImageLoader:fileOperation:3.4.7\ncom.github.hss01248.ImageLoader:frescoGlideBridge:3.4.7\ncom.github.hss01248.ImageLoader:avif-decoder:3.4.7\ncom.github.hss01248.ImageLoader:downloader:3.4.7\ncom.github.hss01248.ImageLoader:imageDebugger:3.4.7\ncom.github.hss01248.ImageLoader:baseWebview:3.4.7\ncom.github.hss01248.ImageLoader:glidebase:3.4.7\ncom.github.hss01248.ImageLoader:bigimageviewpager:3.4.7\ncom.github.hss01248.ImageLoader:webviewspider:3.4.7\ncom.github.hss01248.ImageLoader:glidev4:3.4.7\ncom.github.hss01248.ImageLoader:imagelist:3.4.7\n```\n\n\u003e 一条龙地支持fresco和glide\n\n图片加载:[ImageLoader](https://github.com/hss01248/ImageLoader)  --\u003e\u003e 图片选择: [PhotoPicker](https://github.com/hss01248/PhotoPicker)  --\u003e\u003e拍照/选图/裁剪/压缩: [PhotoOut](https://github.com/hss01248/PhotoOut)\n\n# 效果图:\n\n![recyleview](pics/recyleview.jpg)\n\n\n\n\n\n\n\n![config_fresco_fitcenter](pics/config_fresco_fitcenter.jpg)\n\n\n\n![config_glide](pics/config_glide.jpg)\n\n\n\n\n\n# 优化缓存文件大小\n\n 图片下载完成后,给它压缩成webp,然后替换调原缓存文件, 小尺寸的图也换成webp\n\n\n\n\n\n\n\n### 更新日志\n\nhttps://github.com/hss01248/ImageLoader/blob/master/LOG.md\n\n```\npublic interface ILoader {\n\n    void init(Context context,int cacheSizeInM);//初始化\n   \n    void request(SingleConfig config);//核心方法,仅供内部调用\n\t\n\t//图片加载的暂停和继续\n    void pause();\n    void resume();\n    \n    //缓存大小与清除\n     void clearDiskCache();\n    void clearMomoryCache();\n    long getCacheSize();\n    \n    //下面是操作磁盘缓存的一些方法(glide无法同步获取,fresco可以)\n    void clearCacheByUrl(String url);\n    File getFileFromDiskCache(String url);\n    boolean  isCached(String url);\n    \n    //下面是内存的优化-响应app的内存事件,做出相应的处理\n    void trimMemory(int level);\n\n    void clearAllMemoryCaches();\n\n}\n```\n# 初始化\n\n### Application中:\n\noncreate方法中:\n\n传入全局context和定义缓存文件夹的大小\n\n```\n\ninit(final Context context, int cacheSizeInM,ILoader loader)//指定缓存大小,以及使用哪个loader\n\n    \n```\n\n响应app的内存事件,预防OOM:\n\n```\n\n    @Override\n    public void onTrimMemory(int level) {\n        super.onTrimMemory(level);\n        ImageLoader.trimMemory(level);\n    }\n\n    @Override\n    public void onLowMemory() {\n        super.onLowMemory();\n        ImageLoader.clearAllMemoryCaches();\n    }\n    \n```\n\n\n\n# 入口方法\n\n\u003e 该方法返回SingleConfig.ConfigBuilder\n\n```\nImageLoader.with(this)\n```\n\n# 自定义设置\n\n## 几种不同的图片源\n\n```\n.url(String url)\n\n.file(String filePath)\n\n.res(int resId)\n\n.content(String contentProvider)\n```\n\n## https时是否忽略证书校验\n\n\u003e 默认不忽略\n\n```\n.ignoreCertificateVerify(boolean ignoreCertificateVerify)\n```\n\n## 传入宽高,用于resize,以节省内存(必传参数)\n\n\u003e 一般,传如用于显示的那个view的宽高就行,单位为dp.内部会自行转换为px\n\u003e\n\u003e 框架能根据这两个参数去把图片流解压成这个大小的bitmap,可以节约内存空间\n\n```\nwidthHeight(int width,int height)\n```\n\n## 占位图/默认图\n\u003e 本方法的生效规则: \n\u003e 当容器view可复用(在recycleview,或者可复用的viewpager中)时,一定会设置占位图,否则会出现两幅实际图片快速切换闪烁的情况\n\u003e 当容器view不复用时,当且仅当图片源为网络图片且本地没有缓存时,才会设置placeholder.以避免placehoder和正式图片的快速切换闪烁\n\n```\nplaceHolder(int placeHolderResId,boolean reuseable)\n\n```\n\n## error图\n\n```\nerror(int  errorResId)\n\n```\n\n## 圆角矩形\n\n\u003e 可以设置圆角的半径,以及当图片是gif动图时,用什么颜色来盖一层,以实现动图时的圆角\n\n```\nrectRoundCorner(int rectRoundRadius,int overlayColorWhenGif)\n```\n\n## 设置图片为圆形\n\n```\nasCircle(int overlayColorWhenGif)\n```\n\n## 图片的边框(glide不支持)\n```\nborder(int borderWidth,int borderColor)\n```\n\n## 缩放模式\n\n\u003e 参考fresco的模式设置,取值为ScaleMode.xxx.\n\u003e\n\u003e 这个模式只会改变bitmap展示在view上面的模式,而不会改变bitmap在内存中的大小\n\n```\nscale(int scaleMode)\n```\n\n| 类型                                       | 描述                                       |\n| ---------------------------------------- | ---------------------------------------- |\n| center                                   | 居中，无缩放。                                  |\n| centerCrop                               | 保持宽高比缩小或放大，使得两边都大于或等于显示边界，且宽或高契合显示边界。居中显示。 |\n| [focusCrop](https://www.fresco-cn.org/docs/scaling.html#focusCrop) | 同centerCrop, 但居中点不是中点，而是指定的某个点。          |\n| centerInside                             | 缩放图片使两边都在显示边界内，居中显示。和 `fitCenter` 不同，不会对图片进行放大。如果图尺寸大于显示边界，则保持长宽比缩小图片。 |\n| fitCenter                                | 保持宽高比，缩小或者放大，使得图片完全显示在显示边界内，且宽或高契合显示边界。居中显示。 |\n| fitStart                                 | 同上。但不居中，和显示边界左上对齐。                       |\n| fitEnd                                   | 同fitCenter， 但不居中，和显示边界右下对齐。              |\n| fitXY                                    | 不保存宽高比，填充满显示边界。                          |\n\n## 配置高斯模糊\n\n\u003e 传入的参数blurRadius为模糊度,越大就越模糊,实际效果要自己调试好相应的数字\n\n```\nblur(int blurRadius)\n```\n\n# 最终的出口方法有两个\n\n## 显示到某一个view中\n\n```\ninto(View targetView)\n```\n\n## 或者,只拿bitmap引用\n\n\u003e 此时,scale的配置是无效的,因为没有view去给它展示. 而其他设置的宽高,高斯模糊,圆角或圆形效果,都能生效,最终给你一个你想要的bitmap\n\n```\nasBitmap(BitmapListener bitmapListener)\n```\n\n\n\n# 加载大图\n\n内部采用的是   https://github.com/davemorrissey/subsampling-scale-image-view\n\n## 加载单张大图:\n\n```\nImageLoader.loadBigImage(BigImageView imageView,String path)\n\n//说明: path可以是网络url,文件路径或者content://格式的路径\n当是网络url时,注意应该以http开头,这里内部不提供拼接功能\n```\n\n内置了placeholder,progressbar,errorview.\n\n\n\n![placeholder](pics/placeholder.jpg)\n\n![progress](pics/progress.jpg)\n\n![error](pics/error.jpg)\n\n\n\n \n\n## 加载多张大图:\n\n\u003e 用户只需要传入单纯的viewPager对象,框架会替调用者设置好特定的adapter.\n\u003e\n\u003e pageradapter内部只构建4个BigImageView,滑动时复用此view,则对应的bitmap能够被不断回收.\n\n```\nImageLoader.loadBigImages(ViewPager viewPager, List\u003cString\u003e urls)//urls或filepaths\n```\n\n之前BigImageView有内存泄漏时,.几十张超级大图(4000*3000像素左右),快速滑动和快速缩放时,内存占用偶尔冲上五六十M,但很快会降到40M左右,关掉activity内存一直不下,解决内存泄漏后,十分清爽:\n\n 前一次的activity泄漏:多次进出,基线维持在40M水平![memory in viewpager](memory in viewpager.jpg)\n\n解决了内存泄漏后:20M左右\n\n ![leaksolved](leaksolved.png)\n\n\n\n\u003e 注意,如果是使用Picasso,请在viewpager所在的activity的ondestroy方法中调用:(清除磁盘缓存)\n\n```\nPicassoBigLoader.clearCache()\n```\n\n\n\n# 内存优化的几个策略的说明\n\n## bitmap编码\n\n将fresco框架默认的RGB_888改成RGB_565,每张图片内存能减小一半,而显示效果相差并不大.\n\n```\n初始化时ImagePipelineConfig设置setBitmapsConfig(Bitmap.Config.RGB_565)\n```\n\n## downsampling和resization配合\n\n图片向下采样,将图片采样成设定的宽高的bitmap,而不是加载原图.\n\n```\n初始化时ImagePipelineConfig.Builder设置setDownsampleEnabled(true)//同时支持PNG，JPG以及WEP格式的图片\n\n每次加载图片时,指定宽高,即可执行resization,将图片解析成该宽高的bitmap.\n```\n\n## 预防OOM\n\n参见 [Fresco 5.0以上内存持续增长问题优化](http://blog.csdn.net/honjane/article/details/65629799)\n\n自定义控制fresco的内存对象池大小\n\n```\n初始化时ImagePipelineConfig.Builder设置setBitmapMemoryCacheParamsSupplier(new MyBitmapMemoryCacheParamsSupplier(activityManager))\n```\n\n并且响应app的内存事件,在内存不够时进行清除内存缓存.\n\n```\nApplication的回调中调用方法:\n\n@Override\n    public void onTrimMemory(int level) {\n        super.onTrimMemory(level);\n        ImageLoader.trimMemory(level);\n    }\n\n    @Override\n    public void onLowMemory() {\n        super.onLowMemory();\n        ImageLoader.clearAllMemoryCaches();\n    }\n```\n\n## 外部辅助\n\n\u003e 如果图片用的是七牛云存储或者阿里云,那么利用他们的图片处理的api,请求时带上目标宽高等参数,让他们裁剪成你要的小图后返回,不仅省内存,而且省流量.\n\n# 示例代码:\n\n```\nImageLoader.with(this)\n        .url(\"https://pic1.zhimg.com/v2-7868c606d6ddddbdd56f0872e514925c_b.jpg\")\n        .placeHolder(R.mipmap.ic_launcher)\n        .widthHeight(250,150)\n        .asCircle(R.color.colorPrimary)\n        .into(ivUrl);\n        \nImageLoader.with(this)\n                .placeHolder(R.mipmap.ic_launcher)\n                .res(R.drawable.thegif)\n                .widthHeight(250,150)\n                .rectRoundCorner(15,R.color.colorPrimary)\n                .asBitmap(new SingleConfig.BitmapListener() {\n                    @Override\n                    public void onSuccess(Bitmap bitmap) {\n                        Log.e(\"bitmap\",bitmap.getWidth()+\"---height:\"+bitmap.getHeight()+\"--\"+bitmap.toString());\n                    }\n\n                    @Override\n                    public void onFail() {\n                        Log.e(\"bitmap\",\"fail\");\n\n                    }\n                });\n```\n\n\n\n\n\n# usage\n\n## gradle\n\n**Step 1.** Add the JitPack repository to your build file\n\nAdd it in your root build.gradle at the end of repositories:\n\n```\n    allprojects {\n        repositories {\n            ...\n            maven { url \"https://jitpack.io\" }\n        }\n    }\n```\n\n**Step 2.** Add the dependency( 三选一即可)\n\n```\n    dependencies {\n              compile 'com.github.hss01248.ImageLoader:fresco:1.0.8'//如果使用fresco\n              compile 'com.github.hss01248.ImageLoader:glide:1.0.8'//如果使用glide\n              compile 'com.github.hss01248.ImageLoader:picasso:1.0.8'//如果使用picasso\n    }\n```\n\n\n\n\n\n## 脸部识别\n\n\u003e 因为耗时长,需要依赖com.google.android.gms:play-services,国内阉割版rom用不了.\n\u003e\n\u003e 所以没有引入到包中,但已预留相关接口\n\u003e\n\u003e 需要的自行打开那一行代码注释即可试用\n\n\n\nhttps://github.com/aryarohit07/GlideFaceDetectionTransformation\n\nhttps://github.com/aryarohit07/PicassoFaceDetectionTransformation\n\nhttps://github.com/aryarohit07/FrescoFaceDetectionProcessor\n\n\n\n# thanks\n\nhttps://github.com/facebook/fresco\n\nhttps://github.com/Piasy/BigImageViewer\n\n [Fresco 5.0以上内存持续增长问题优化](http://blog.csdn.net/honjane/article/details/65629799)\n\nhttps://github.com/AlexMofer/RecyclePagerAdapter\n\nbitmap转换器:\n\nhttps://github.com/wasabeef/fresco-processors\n\nhttps://github.com/wasabeef/glide-transformations\n\nhttps://github.com/wasabeef/picasso-transformations\n\n\n\n\n\nextend:\n\nhttps://github.com/JakeWharton/picasso2-okhttp3-downloader\n\nhttps://github.com/amitshekhariitbhu/GlideBitmapPool\n\nhttps://github.com/peng8350/LoadingProgress\n\n","funding_links":[],"categories":["图片"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhss01248%2FImageLoader","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhss01248%2FImageLoader","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhss01248%2FImageLoader/lists"}