Image loading for Android backed by Kotlin Coroutines.

Last update: Jun 23, 2022

Coil

An image loading library for Android backed by Kotlin Coroutines. Coil is:

  • Fast: Coil performs a number of optimizations including memory and disk caching, downsampling the image in memory, re-using bitmaps, automatically pausing/cancelling requests, and more.
  • Lightweight: Coil adds ~2000 methods to your APK (for apps that already use OkHttp and Coroutines), which is comparable to Picasso and significantly less than Glide and Fresco.
  • Easy to use: Coil's API leverages Kotlin's language features for simplicity and minimal boilerplate.
  • Modern: Coil is Kotlin-first and uses modern libraries including Coroutines, OkHttp, Okio, and AndroidX Lifecycles.

Coil is an acronym for: Coroutine Image Loader.

Made with ❤️ at Instacart. Translations: 한국어, 中文

Download

Coil is available on mavenCentral().

implementation("io.coil-kt:coil:1.1.1")

Quick Start

To load an image into an ImageView, use the load extension function:

// URL
imageView.load("https://www.example.com/image.jpg")

// Resource
imageView.load(R.drawable.image)

// File
imageView.load(File("/path/to/image.jpg"))

// And more...

Requests can be configured with an optional trailing lambda:

imageView.load("https://www.example.com/image.jpg") {
    crossfade(true)
    placeholder(R.drawable.image)
    transformations(CircleCropTransformation())
}

Image Loaders

imageView.load uses the singleton ImageLoader to enqueue an ImageRequest. The singleton ImageLoader can be accessed using an extension function:

val imageLoader = context.imageLoader

Optionally, you can create your own ImageLoader instance(s) and inject them with dependency injection:

val imageLoader = ImageLoader(context)

If you do not want the singleton ImageLoader, depend on io.coil-kt:coil-base.

Requests

To load an image into a custom target, enqueue an ImageRequest:

val request = ImageRequest.Builder(context)
    .data("https://www.example.com/image.jpg")
    .target { drawable ->
        // Handle the result.
    }
    .build()
val disposable = imageLoader.enqueue(request)

To load an image imperatively, execute an ImageRequest:

val request = ImageRequest.Builder(context)
    .data("https://www.example.com/image.jpg")
    .build()
val drawable = imageLoader.execute(request).drawable

Check out Coil's full documentation here.

Requirements

R8 / Proguard

Coil is fully compatible with R8 out of the box and doesn't require adding any extra rules.

If you use Proguard, you may need to add rules for Coroutines, OkHttp and Okio.

License

Copyright 2021 Coil Contributors

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

GitHub

https://github.com/coil-kt/coil
Comments
  • 1. Dropped frames while scrolling in list with multiple spans

    I'm observing some pretty hefty main thread blockage using the latest Coil version (0.11.0) and older ones too. I just migrated from Glide on this app (I've used Coil before in other projects but never in a RV adapter) and everything was smooth until I tried scrolling on the RV. Anyway, tested with both ixel 3 and OnePlus 7T Pro so clearly not an hardware bottleneck.

    My setup is a 5 span GridLayoutManager vertical scrolling. One device has +300 pictures, the other has ~50, so doesn't seem related to the amount of pictures. What I observe is when I start scrolling when Coil is decoding the URIs and starting to display the thumbnails something seems to block the main thread and the whole thing gets blocked and it seems to suspend the entire operation. Sometimes I have to wait 3-4 seconds for it to finish whatever it seems to be doing and it then resumes.

    In the screenrecord I'm attatching you can see a bit of the jank after I open the app fresh. I made each thumb 8px/8px because it's my personal pictures library, but you get the picture. It obviously has worse jank with their actual decoded size (which should be device width / spancount) (5 in this case). The jank is halved if I decrease the span count to 3 or 4. Here's the very simple code I'm using:

    LoadRequest request = LoadRequest.builder(((ViewHolder) holder).b.picture.getContext())
                        .key(item.getUri().toString())
                        .data(item.getUri())
                        .crossfade(false)
                        .target(((ViewHolder) holder).b.picture)
                        .build();
                Coil.execute(request);
    

    Logcat is filled with these GC related operations when doing the scrolling:

    2020-05-19 20:36:44.160 12402-12415/com.franco.graphice I/franco.graphic: Background young concurrent copying GC freed 11330(820KB) AllocSpace objects, 48(1172KB) LOS objects, 0% free, 8438KB/8438KB, paused 124us total 157.193ms
    2020-05-19 20:36:44.455 12402-12415/com.franco.graphice I/franco.graphic: Background concurrent copying GC freed 22434(2113KB) AllocSpace objects, 127(3216KB) LOS objects, 49% free, 7161KB/13MB, paused 438us total 288.432ms
    2020-05-19 20:36:45.609 12402-12415/com.franco.graphice I/franco.graphic: Background young concurrent copying GC freed 28249(2948KB) AllocSpace objects, 190(4884KB) LOS objects, 0% free, 13MB/13MB, paused 590us total 693.969ms
    2020-05-19 20:36:45.772 12402-12437/com.franco.graphice I/franco.graphic: Waiting for a blocking GC ProfileSaver
    2020-05-19 20:36:46.126 12402-12415/com.franco.graphice I/franco.graphic: Background concurrent copying GC freed 46990(4091KB) AllocSpace objects, 222(5452KB) LOS objects, 49% free, 10MB/20MB, paused 1.728ms total 515.818ms
    2020-05-19 20:36:46.126 12402-12437/com.franco.graphice I/franco.graphic: WaitForGcToComplete blocked ProfileSaver on ClassLinker for 354.762ms
    2020-05-19 20:36:48.146 12402-12415/com.franco.graphice I/franco.graphic: Background young concurrent copying GC freed 111714(5587KB) AllocSpace objects, 253(6552KB) LOS objects, 0% free, 22MB/22MB, paused 300us total 851.007ms
    2020-05-19 20:36:48.421 12402-12415/com.franco.graphice I/franco.graphic: Background concurrent copying GC freed 125680(7618KB) AllocSpace objects, 372(9332KB) LOS objects, 49% free, 8377KB/16MB, paused 654us total 258.322ms
    2020-05-19 20:36:50.169 12402-12415/com.franco.graphice I/franco.graphic: Background concurrent copying GC freed 122438(7099KB) AllocSpace objects, 230(5824KB) LOS objects, 49% free, 5686KB/11MB, paused 48us total 438.112ms
    

    Also it's a bit better when using BitmapConfig RGB_565, but just a tiny bit. With the default BitmapConfig I see tons of these logcat messages:

    2020-05-19 20:38:15.978 12923-12923/com.franco.graphice I/Choreographer: Skipped 40 frames!  The application may be doing too much work on its main thread.
    2020-05-19 20:38:16.211 12923-12965/com.franco.graphice I/OpenGLRenderer: Davey! duration=914ms; Flags=0, IntendedVsync=5662959106048, Vsync=5663625772688, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=5663641456128, AnimationStart=5663641473576, PerformTraversalsStart=5663642302847, DrawStart=5663719940563, SyncQueued=5663865801775, SyncStart=5663866294692, IssueDrawCommandsStart=5663867129952, SwapBuffers=5663869075161, FrameCompleted=5663874209172, DequeueBufferDuration=187000, QueueBufferDuration=1022000, 
    2020-05-19 20:38:16.321 12923-12936/com.franco.graphice I/franco.graphic: Background concurrent copying GC freed 108152(11MB) AllocSpace objects, 478(11MB) LOS objects, 50% free, 17MB/34MB, paused 201us total 1.090s
    

    Any clues or question that I can answer to help you narrow it down somehow?

    Thanks I hope this was clear enough.

    Reviewed by franciscofranco at 2020-05-19 19:39
  • 2. A gif is playing very fast

    tumblr_ku2pvuJkJG1qz9qooo1_r1_400

    Plays really fast than how it is shown in Android Gallery and Chrome. Issue occurs while using ImageDecoderDecoder. If only GifDecoder is used, gif doesn't play at all.

    How do I load this gif? Checkout #539

    This is how it looks when I load it:

    record.mp4.zip

    Reviewed by rupinderjeet at 2020-09-24 10:14
  • 3. How to debug cancellation of load requests

    I am migrating from Picasso to Coil. It went quite easy as the APIs are very similar.

    I have a custom Fetcher for loading internal schemes.

    I load a list of items in a recycler view, each having a logo loaded with Coil by the custom fetcher.

    When I scroll up and down the recycler view list, I see that sometimes a wrong logo is displayed on some of the items. It seems as if the load request, which wasn't done, jumped to one of the new items coming into view. I have to scroll up and down the list a few times to trigger it.

    My guess it that the inflight request connected to the image view isn't cancelled or maybe a bitmap is reused?

    I am pretty sure it isn't a problem with the recycler view recycling of views as Picasso handled it just fine. Also the test on the items is correct. Only the logo is wrong.

    Can you guide me on how to debug this?

    Reviewed by clhols at 2020-06-11 14:23
  • 4. Enable native support for SVG format without boilerplate

    Currently using Glide to load SVG images and the implementation is quite clunky in order to do so. See: https://stackoverflow.com/questions/35507893/does-glide-have-a-method-for-loading-both-png-and-svg

    As a fresh new library hot off the presses, I'd like to see Coil gracefully (and optimally) handle these file formats without a ton of boilerplate.

    EDIT: WebP is already supported, so this enhancement request is more about formats that require an external library for decoding (and a Decoder).

    Thanks!

    Reviewed by 0xMatthewGroves at 2019-08-12 22:22
  • 5. Priority handling for identical data request

    Is your feature request related to a problem? Please describe. At some point in my application an image can be loaded multiple times at different size, but I have no control over the order of the requests. Since I'm allowing inexact size it would be nice if there could be some way to optimize the request for the same data to be better ordered so that cache works better.

    I'm often ending up with all request running more or less simultaneously or in smaller to higher order leading to no usage of the memory cache as each request are larger than the previous one.

    Since I don't know in advance if the images will be displayed multiple times I don't want to use a tons of memory and always use Size(Original).

    I've not found a way to do anything with interceptors or the current pipeline but I maybe missed something.

    Reviewed by Tolriq at 2021-10-01 09:04
  • 6. [coil-video] Fails to load preview for video

    Describe the bug When I'm trying to load preview for video that I picked from my device I'm getting an exception:

    2020-05-22 23:40:14.907 27387-27387/com.example.android I/System.out: load uri: content://com.android.providers.media.documents/document/video%3A158545
    2020-05-22 23:40:14.956 27387-27462/com.example.android D/skia: --- Failed to create image decoder with message 'unimplemented'
    2020-05-22 23:40:14.956 27387-27462/com.example.android D/skia: --- Failed to create image decoder with message 'unimplemented'
    2020-05-22 23:40:14.965 27387-27387/com.example.android I/RealImageLoader: 🚨 Failed - content://com.android.providers.media.documents/document/video%3A158545 - java.lang.IllegalStateException: BitmapFactory returned a null Bitmap. Often this means BitmapFactory could not decode the image data read from the input source (e.g. network or disk) as it's not encoded as a valid image format.
    2020-05-22 23:40:14.967 27387-27387/com.example.android E/RealImageLoader: java.lang.IllegalStateException: BitmapFactory returned a null Bitmap. Often this means BitmapFactory could not decode the image data read from the input source (e.g. network or disk) as it's not encoded as a valid image format.
            at coil.decode.BitmapFactoryDecoder.decode(BitmapFactoryDecoder.kt:177)
            at coil.RealImageLoader$loadData$2.invokeSuspend(RealImageLoader.kt:349)
            at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
            at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56)
            at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
            at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:738)
            at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
            at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)
    2020-05-22 23:40:17.922 27387-27523/com.example.android V/FA: Inactivity, disconnecting from the service
    

    Expected behavior Would like to see thumbnail

    To Reproduce The code is pretty standard

    
    val imageLoader = ImageLoader.Builder(requireContext())
                .componentRegistry {
                    add(VideoFrameFileFetcher(requireContext()))
                    add(VideoFrameUriFetcher(requireContext()))
                }
                .build()
    
    val request = LoadRequestBuilder(requireContext())
                    .data(uri)
                    .videoFrameMillis(2000)
                    .target(myImageView)
                    .build()
                imageLoader.execute(request)
    

    Version coil-version 0.11.0 Android 9 coil-video is added

    Reviewed by gabin8 at 2020-05-22 20:49
  • 7. Software rendering doesn't support hardware bitmaps

    java.lang.IllegalArgumentException: Software rendering doesn't support hardware bitmaps at android.graphics.BaseCanvas.onHwBitmapInSwMode(BaseCanvas.java:550) at android.graphics.BaseCanvas.throwIfHwBitmapInSwMode(BaseCanvas.java:557) at android.graphics.BaseCanvas.throwIfCannotDraw(BaseCanvas.java:69) at android.graphics.BaseCanvas.drawBitmap(BaseCanvas.java:127) at android.graphics.Canvas.drawBitmap(Canvas.java:1516) at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:545) at android.widget.ImageView.onDraw(ImageView.java:1360) at android.view.View.draw(View.java:20332) at android.view.View.draw(View.java:20194) at android.view.ViewGroup.drawChild(ViewGroup.java:4395) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174) at androidx.constraintlayout.widget.ConstraintLayout.dispatchDraw(ConstraintLayout.java:1767) at android.view.View.draw(View.java:20340) at android.view.View.draw(View.java:20194) at android.view.ViewGroup.drawChild(ViewGroup.java:4395) at androidx.recyclerview.widget.RecyclerView.drawChild(RecyclerView.java:5030) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174) at android.view.View.draw(View.java:20340) at androidx.recyclerview.widget.RecyclerView.draw(RecyclerView.java:4429) at android.view.View.draw(View.java:20194) at android.view.ViewGroup.drawChild(ViewGroup.java:4395) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174) at androidx.constraintlayout.widget.ConstraintLayout.dispatchDraw(ConstraintLayout.java:1767) at android.view.View.draw(View.java:20340) at android.view.View.draw(View.java:20194) at android.view.ViewGroup.drawChild(ViewGroup.java:4395) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174) at android.view.View.draw(View.java:20192) at android.view.ViewGroup.drawChild(ViewGroup.java:4395) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174) at androidx.constraintlayout.widget.ConstraintLayout.dispatchDraw(ConstraintLayout.java:1767) at android.view.View.draw(View.java:20340) at android.view.View.draw(View.java:20194) at android.view.ViewGroup.drawChild(ViewGroup.java:4395) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174) at android.view.View.draw(View.java:20192) at android.view.ViewGroup.drawChild(ViewGroup.java:4395) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174) at android.view.View.draw(View.java:20192) at android.view.ViewGroup.drawChild(ViewGroup.java:4395) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174) at android.view.View.draw(View.java:20192) at android.view.ViewGroup.drawChild(ViewGroup.java:4395) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174) at android.view.View.draw(View.java:20192) at android.view.ViewGroup.drawChild(ViewGroup.java:4395) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174) at android.view.View.draw(View.java:20340) at com.android.internal.policy.DecorView.draw(DecorView.java:781) at android.view.ViewRootImpl.drawSoftware(ViewRootImpl.java:3582) at android.view.ViewRootImpl.draw(ViewRootImpl.java:3472) at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3244) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2598) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1521) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7437) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:965) at android.view.Choreographer.doCallbacks(Choreographer.java:777) at android.view.Choreographer.doFrame(Choreographer.java:709) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:951) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:193)

    Reviewed by mt131 at 2019-11-01 02:41
  • 8. Check if view is attached to window before checking hwAcceleration

    I've been able to reproduce the issue sometimes which led me to believe this is some kind of a race condition in checking the hw acceleration capabilities for which we need the View to be attached to the window. To be safe, I now check if we're attached to window before checking for the HW acceleration.

    Please test and let me know if this works for you.

    Signed-off-by: Mario Danic [email protected]

    Reviewed by mario at 2020-01-20 10:04
  • 9. Images cropped while load for the first time in recycler view if I kept scrolling

    Describe the bug I have some images cropped when loading them for the first time and kept scrolling while loading

    Expected behavior All Images should be fully loaded

    To Reproduce Load about 10 images in recycler view and start scrolling

    Logs/Screenshots Screen record: https://drive.google.com/file/d/1zBgkdsWDcEoFWy8FU66Uud0VTgF9j_pJ/view?usp=sharing

    Version I am on version 1.1.1 , It was tested on android 10

    Reviewed by Omar-Alnajjar at 2021-04-02 14:47
  • 10. Get the image file from a preloaded image

    Is your feature request related to a problem? Please describe. I'm looking for a way to get the image file from a preloaded image, but seems Coil lacks this feature at the moment.

    Describe the solution you'd like On Glide I do:

    val preloadedImageFile = Glide
        .with(context)
        .downloadOnly()
        .load(imageUrl)
        .submit()
        .get()
    

    Would be nice if we have at least one of these options in Coil:

    Coil.getFile(imageUrl)
    
    Coil.load(context, imageUrl) {
        target(object : FileTarget {
            override fun onSuccess(result: File) {
                
            }
        })
    }
    
    Reviewed by adrielcafe at 2019-09-14 01:01
  • 11. Image flickers when url changes for rememberImagePainter

    Currently I'm using a library to reorder items in a LazyColumn. The library works and functions as expected. The issue I'm running into is that when an item is reordered in the list, it causes a recomposition because my state has changed since the position of the item has changed. This is fine, but when items in my list recompose, they might have different urls so it tries to load the new image for both items that had their positions change. This causes a flicker as it tries to load new images. I've tried to use caching to prevent rememberImagePainter from having to go fetch the image again but I don't think that's how that works. I've tried to prevent the request from going through by providing an ExecuteCallback that returned false if the state wasn't empty and that didn't work either.

    I would expect to be able to configure coil to not re-load an image when a url changes but instead use a cached version if it exists.

    I'm using version 1.3.2 and it's not device specific.

    Reviewed by cj1098 at 2021-10-08 00:17
  • 12. Update coroutines to v1.6.3

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | org.jetbrains.kotlinx:kotlinx-coroutines-test | 1.6.2 -> 1.6.3 | age | adoption | passing | confidence | | org.jetbrains.kotlinx:kotlinx-coroutines-android | 1.6.2 -> 1.6.3 | age | adoption | passing | confidence |


    Release Notes

    Kotlin/kotlinx.coroutines

    v1.6.3

    Compare Source

    • Updated atomicfu version to 0.17.3 (#​3321), fixing the projects using this library with JS IR failing to build (#​3305).

    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about these updates again.


    • [ ] If you want to rebase/retry this PR, click this checkbox.

    This PR has been generated by Mend Renovate. View repository job log here.

    Reviewed by renovate[bot] at 2022-06-20 15:26
  • 13. Update plugin dokka to v1.7.0

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | org.jetbrains.dokka | 1.6.10 -> 1.7.0 | age | adoption | passing | confidence |


    Release Notes

    Kotlin/dokka

    v1.7.0

    Improvements
    General
    HTML format
    Javadoc format
    GFM format
    Kotlin-as-Java plugin
    Gradle runner
    Fixes
    General bugfixes
    Security
    Plugin API
    Other

    Thanks to all the contributors!

    v1.6.21

    This is a bugfix release that mostly enables building documentation for multiplatform projects that utilize .klib libraries.

    Changes

    Bugfixes

    • Support KLIB libraries for common platform, previously led to ERROR CLASS instead of references in documentation (#​2441)
    • Fixed a maven plugin build problem related to coroutines which only occurred in multi-module builds (#​2461)

    v1.6.20

    Features
    HTML format changes
    Bugfixes
    Plugin API Changes
    General Improvements
    Known issues
    • Kotlin Multiplatform projects that use .klib libraries may experience problems. There will be a separate 1.6.21 release that will address this issue shortly.

    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, click this checkbox.

    This PR has been generated by Mend Renovate. View repository job log here.

    Reviewed by renovate[bot] at 2022-06-19 18:27
  • 14. Placing cache files in subfolders

    The disk cache creates 2 files with a long name for each cached item. In my case the cache is placed on sd-card with FAT32. Many small images and cache has reached limit of "number of files per folder in FAT32" (65k entries for 8.3 names, but the long name takes a few entries). At the same time, cache size was only 30 mb.

    Need the ability to set cached files to be stored in subfolders

    Reviewed by vitidev at 2022-06-19 17:21
  • 15. Support load APK files icons

    Is your feature request related to a problem? Please describe.

    If we can add an ability to load the APK files' icon?

    Describe the solution you'd like

    android.content.pm.PackageItemInfo#loadIcon
    

    Additional context

    Reviewed by Goooler at 2022-06-17 09:42
  • 16. Support a FakeImageLoader for typical Preview use cases

    The https://coil-kt.github.io/coil/image_loaders/#testing docs suggest implementing a custom ImageLoader.

    But there could be some useful defaults, like loading DrawableRes, or mapping a url to a test image.

    https://github.com/google/horologist/blob/fdc4fa6b4bb4387c2ec7804a9c5eb9c67f909764/tiles/src/androidTest/java/com/google/android/horologist/tiles/FakeImageLoader.kt

    It would be nice to have a Test or Fake ImageLoader that implemented sensible defaults for situations like Previews.

    Would this be accepted as a PR?

    Reviewed by yschimke at 2022-06-16 06:02
Android Asynchronous Networking and Image Loading
Android Asynchronous Networking and Image Loading

Android Asynchronous Networking and Image Loading Download Maven Git Features Kotlin coroutine/suspend support Asynchronously download: Images into Im

Jun 17, 2022
Library to handle asynchronous image loading on Android.

WebImageLoader WebImageLoader is a library designed to take to hassle out of handling images on the web. It has the following features: Images are dow

Sep 8, 2021
🍂 Jetpack Compose image loading library which can fetch and display network images using Glide, Coil, and Fresco.
🍂 Jetpack Compose image loading library which can fetch and display network images using Glide, Coil, and Fresco.

?? Jetpack Compose image loading library which can fetch and display network images using Glide, Coil, and Fresco.

Jun 17, 2022
Powerful and flexible library for loading, caching and displaying images on Android.
Powerful and flexible library for loading, caching and displaying images on Android.

Universal Image Loader The great ancestor of modern image-loading libraries :) UIL aims to provide a powerful, flexible and highly customizable instru

Jun 22, 2022
Compose Image library for Kotlin Multiplatform.

Compose ImageLoader Compose Image library for Kotlin Multiplatform. Setup Add the dependency in your common module's commonMain sourceSet kotlin {

Jun 21, 2022
🦄 Android Pokedex-AR using ARCore, Sceneform, Hilt, Coroutines, Flow, Jetpack based on MVVM architecture.
🦄 Android Pokedex-AR using ARCore, Sceneform, Hilt, Coroutines, Flow, Jetpack based on MVVM architecture.

Pokedex-AR Pokedex-AR is a small demo application based on AR, modern Android application tech-stacks, and MVVM architecture. This project focuses on

Jun 15, 2022
A powerful image downloading and caching library for Android
A powerful image downloading and caching library for Android

Picasso A powerful image downloading and caching library for Android For more information please see the website Download Download the latest AAR from

Jun 20, 2022
An Android transformation library providing a variety of image transformations for Glide.
An Android transformation library providing a variety of image transformations for Glide.

Glide Transformations An Android transformation library providing a variety of image transformations for Glide. Please feel free to use this. Are you

Jun 21, 2022
An android image compression library.
An android image compression library.

Compressor Compressor is a lightweight and powerful android image compression library. Compressor will allow you to compress large photos into smaller

Jun 24, 2022
An Android transformation library providing a variety of image transformations for Picasso
An Android transformation library providing a variety of image transformations for Picasso

Picasso Transformations An Android transformation library providing a variety of image transformations for Picasso. Please feel free to use this. Are

Jun 24, 2022
Image Picker for Android 🤖
Image Picker for Android 🤖

Image Picker for Android ??

Jun 17, 2022
Luban(鲁班)—Image compression with efficiency very close to WeChat Moments/可能是最接近微信朋友圈的图片压缩算法

Luban ?? English Documentation Luban(鲁班) —— Android图片压缩工具,仿微信朋友圈压缩策略。 Luban-turbo —— 鲁班项目的turbo版本,查看trubo分支。 写在前面 家境贫寒,工作繁忙。只能不定期更新,还望网友们见谅! 项目描述 目前做A

Jun 24, 2022
ZoomableComposeImage - A zoomable image for jetpack compose

ZoomableComposeImage - A zoomable image for jetpack compose

Apr 17, 2022
ComposeImageBlurhash is a Jetpack Compose component with the necessary implementation to display a blurred image
ComposeImageBlurhash is a Jetpack Compose component with the necessary implementation to display a blurred image

compose-image-blurhash ComposeImageBlurhash is a Jetpack Compose component with the necessary implementation to display a blurred image while the real

May 31, 2022
Easy to use, lightweight custom image view with rounded corners.
Easy to use, lightweight custom image view with rounded corners.

RoundedImageView Easy to use, lightweight custom image view with rounded corners. Explore the docs » View Demo · Report Bug · Request Feature About Th

Dec 23, 2021
load-the-image Apply to compose-jb(desktop), Used to load network and local pictures.

load-the-image load-the-image Apply to compose-jb(desktop), Used to load network and local pictures. ?? Under construction It may change incompatibly

Jun 8, 2022
A simple & efficient anti-afk plugin written in kotlin
A simple & efficient anti-afk plugin written in kotlin

Chat Box A simple & efficient anti-afk plugin written in kotlin. Features Permission based afk bypasses Configurable settings Dependencies helper Comp

Mar 5, 2022
An Android library for managing images and the memory they use.
An Android library for managing images and the memory they use.

Fresco Fresco is a powerful system for displaying images in Android applications. Fresco takes care of image loading and display, so you don't have to

Jun 17, 2022
Adds touch functionality to Android ImageView.

TouchImageView for Android Capabilities TouchImageView extends ImageView and supports all of ImageView’s functionality. In addition, TouchImageView ad

Jun 25, 2022