SDWebImageWebPCoder

repository·master·Indexed 42 days ago

https://github.com/sdwebimage/sdwebimagewebpcoder

A WebP decoding and encoding plugin for the SDWebImage library, providing support for both static and animated WebP images. It includes features for progressive animation loading, thumbnail decoding, memory footprint limiting via decodeScaleDownLimitBytes, and advanced libwebp codec configuration.

Tokens
2.2K
Snippets
8
Records
9
Agent score
5%

What's inside SDWebImageWebPCoder

  1. Register the WebP Coder with SDImageCodersManager

    master

    Before loading WebP images, you must register the SDImageWebPCoder with the SDImageCodersManager. It is recommended to perform this step during app launch (e.g., in AppDelegate).

    // Swift
    let WebPCoder = SDImageWebPCoder.shared
    SDImageCodersManager.shared.addCoder(WebPCoder)
    
    // Objective-C
    SDImageWebPCoder *webPCoder = [SDImageWebPCoder sharedCoder];
    [[SDImageCodersManager sharedManager] addCoder:webPCoder];
  2. Modify HTTP Accept Header for WebP support

    master

    To inform image servers that your client supports WebP, modify the Accept header in SDWebImageDownloader. By default, SDWebImage uses image/*,*/*;q=0.8. Adding image/webp allows servers to return WebP images instead of other formats.

    // Swift
    SDWebImageDownloader.shared.setValue("image/webp,image/*,*/*;q=0.8", forHTTPHeaderField:"Accept")
    
    // Objective-C
    [[SDWebImageDownloader sharedDownloader] setValue:"image/webp,image/*,*/*;q=0.8" forHTTPHeaderField:"Accept"];
  3. Install SDWebImageWebPCoder

    master

    You can install SDWebImageWebPCoder using CocoaPods, Carthage, or Swift Package Manager.

    CocoaPods

    Add this to your Podfile:

    pod 'SDWebImageWebPCoder'

    Carthage

    Add this to your Cartfile:

    github "SDWebImage/SDWebImageWebPCoder"

    Swift Package Manager (Xcode 11+)

    Add the following dependency to your Package.swift:

    let package = Package(
        dependencies: [
            .package(url: "https://github.com/SDWebImage/SDWebImageWebPCoder.git", from: "0.3.0")
        ]
    )
  4. Load WebP images with SDWebImage

    master

    Once the coder is registered, you can load WebP images using standard SDWebImage methods on UIImageView or SDAnimatedImageView.

    // Swift
    let webpURL: URL
    let imageView: UIImageView
    imageView.sd_setImage(with: webpURL)
    
    // Objective-C
    NSURL *webpURL;
    UIImageView *imageView;
    [imageView sd_setImageWithURL:webpURL];
  5. Enable Progressive Animation Loading for WebP

    master

    For animated WebP images, you can enable progressive loading using SDAnimatedImageView. Set shouldIncrementalLoad to true and use the .progressiveLoad option.

    // Swift
    let webpURL: URL
    let imageView: SDAnimatedImageView
    imageView.shouldIncrementalLoad = true
    imageView.sd_setImage(with: webpURL, placeholderImage: nil, options: [.progressiveLoad])
    
    // Objective-C
    NSURL *webpURL;
    SDAnimatedImageView *imageView;
    imageView.shouldIncrementalLoad = YES;
    [imageView sd_setImageWithURL:webpURL placeholderImage:nil options:SDWebImageProgressiveLoad];
  6. Encode images to WebP format

    master

    SDImageWebPCoder supports encoding static images and animated frames into WebP.

    Encoding Options

    • .encodeCompressionQuality: Set quality between 0 and 1.
    • .encodeMaxFileSize: Limit the output file size (e.g., in bytes).
    • .encodeMaxPixelSize: Limit the maximum pixel size for encoding thumbnails.

    Animated Encoding

    To encode an animated WebP, provide an array of SDImageFrame objects and a loopCount (0 for infinite).

    // Swift: Encode static image with quality
    let webpData = SDImageWebPCoder.shared.encodedData(with: image, format: .webP, options: [.encodeCompressionQuality: 0.1])
    
    // Swift: Encode animated WebP
    let awebpData = SDImageWebPCoder.shared.encodedData(with: frames, loopCount: 0, format: .webP, options: nil)
    
    // Objective-C: Encode with max file size
    NSData *limitedWebpData = [[SDImageWebPCoder sharedCoder] encodedDataWithImage:image format:SDImageFormatWebP options:@{SDImageCoderEncodeMaxFileSize : @(1024 * 10)}];
    
    // Objective-C: Encode animated WebP
    NSData *awebpData = [[SDImageWebPCoder sharedCoder] encodedDataWithFrames:frames loopCount:0 format:SDImageFormatWebP options:nil];
  7. Use advanced libwebp codec options

    master

    You can pass advanced libwebp configuration options directly to the encoder via the SDImageCoderOptions dictionary. Supported keys include SDImageCoderEncodeWebPMethod and SDImageCoderEncodeWebPAlphaCompression.

    Example mapping:

    • SDImageCoderEncodeWebPMethod -> config->method
    • SDImageCoderEncodeWebPAlphaCompression -> config->alpha_quality
    // Swift
    let options = [.encodeWebPMethod: 0, .encodeWebPAlphaCompression: 100]
    let data = SDImageWebPCoder.shared.encodedData(with: image, format: .webP, options: options)
    
    // Objective-C
    SDImageCoderOptions *options = @{SDImageCoderEncodeWebPMethod: @(0), SDImageCoderEncodeWebPAlphaCompression: @(100)};
    NSData *data = [SDImageWebPCoder.sharedCoder encodedDataWithImage:image format:SDImageFormatWebP options:options];
  8. Decode WebP images and thumbnails

    master

    Use SDImageWebPCoder to decode WebP data into images. You can also decode thumbnails or limit the memory footprint during decoding.

    Thumbnail Decoding

    Use the .decodeThumbnailPixelSize option to specify a target size.

    Decoding with limit bytes

    Use the .decodeScaleDownLimitBytes option to ensure the resulting pixel buffer in RAM is less than a specific size (e.g., 1MB). This is useful for large images.

    // Swift: Decode with thumbnail size
    let thumbnailSize = CGSize(width: 300, height: 300)
    let image = SDImageWebPCoder.shared.decodedImage(with: data, options: [.decodeThumbnailPixelSize: thumbnailSize])
    
    // Swift: Decode with limit bytes
    let limitBytes = 1024 * 1024 // 1MB
    let image = SDImageWebPCoder.shared.decodedImage(with: data, options: [.decodeScaleDownLimitBytes: limitBytes])
    
    // Objective-C: Decode with thumbnail size
    CGSize thumbnailSize = CGSizeMake(300, 300);
    UIImage *thumbnailImage = [[SDImageWebPCoder sharedCoder] decodedImageWithData:webpData options:@{SDImageCoderDecodeThumbnailPixelSize : @(thumbnailSize)}];
    
    // Objective-C: Decode with limit bytes
    NSUInteger limitBytes = 1024 * 1024; // 1MB
    UIImage *image = [[SDImageWebPCoder sharedCoder] decodedImageWithData:webpData options:@{SDImageCoderDecodeScaleDownLimitBytes : @(limitBytes)}];