Giter Club home page Giter Club logo

Comments (5)

onevcat avatar onevcat commented on July 22, 2024 1

Hi,

As I tried, it seems that the default image processor is already supporting AVIF with UIImageView extension, so I guess you can just give the URL of an AVIF image to Kingfisher and it should just work. See the example in action:

截屏2024-04-30 19 30 21

As I tried under iOS 16 and iOS 17, both seems working fine.

Do you have a case (maybe any earlier iOS versions?) that it does not work?


If the default one does not work in some cases, it is still very easy to integrating any existing AVIF decoder to Kingfisher. Take the avif.swift as example, after importing, you can add these to your project to load an AVIF image:

struct KingfisherAVIFProcessor: ImageProcessor {
    var identifier: String = "KingfisherAVIF"
    
    func process(item: ImageProcessItem, options: KingfisherParsedOptionsInfo) -> KFCrossPlatformImage? {
        switch item {
        case .data(let data):
            return AVIFDecoder.decode(data)
        case .image(let image):
            return image
        }
    }
}

struct KingfisherAVIFSerializer: CacheSerializer {
    func data(with image: Kingfisher.KFCrossPlatformImage, original: Data?) -> Data? {
        return try? AVIFEncoder.encode(image: image, quality: 50)
    }
    
    func image(with data: Data, options: Kingfisher.KingfisherParsedOptionsInfo) -> Kingfisher.KFCrossPlatformImage? {
        return AVIFDecoder.decode(data)
    }
}

And use it as:

imageView.kf.setImage(
  with: url, 
  options: [
    .processor(KingfisherAVIFProcessor()), 
    .cacheSerializer(KingfisherAVIFSerializer())
  ]
)

from kingfisher.

onevcat avatar onevcat commented on July 22, 2024 1

thanks for the quick reply! You're right, it works fine in most cases. I forgot to mention, that it doesn't works on iOS 15. I've checked on iPhone 13 mini, iOS 15.4.

For that case, maybe I can recommend to apply the DefaultImageProcessor first, and then if it returns nil, use the method from AVIF specified decoder:

struct KingfisherAVIFProcessor: ImageProcessor {
    var identifier: String = "KingfisherAVIF"
    
    func process(item: ImageProcessItem, options: KingfisherParsedOptionsInfo) -> KFCrossPlatformImage? {
        switch item {
        case .data(let data):
            return DefaultImageProcessor.default.process(item: item, options: options) ?? AVIFDecoder.decode(data)
        case .image(let image):
            return image
        }
    }
}

Then it is possible for you to get the system default implementation if the system can decode the image. Otherwise if for older systems, fallback to the AVIF specified decoders.

from kingfisher.

freemansion avatar freemansion commented on July 22, 2024

Our project currently heavily uses Kingfisher, but we struggle loading images in AVIF format.
Any plans to introduce support of AVIF?
Does anybody found workaround?

from kingfisher.

freemansion avatar freemansion commented on July 22, 2024

hey @onevcat , thanks for the quick reply! You're right, it works fine in most cases. I forgot to mention, that it doesn't works on iOS 15. I've checked on iPhone 13 mini, iOS 15.4.
But anyway, thanks a lot sharing a workaround, much appreciated!

from kingfisher.

freemansion avatar freemansion commented on July 22, 2024

yeah, keeping default image processor make sense. thanks for sharing thoughts!

from kingfisher.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.