JxlCoder 1.7.3

JxlCoder 1.7.3

https://github.com/awxkee/jxl-coder-swift维护。



JxlCoder 1.7.3

  • 用户名

JxlCoder

这是什么?

此包为所有苹果平台的 JXL 图片提供支持。支持以方便快捷的方式编码和解码 JXL 图片。

一个用于在 iOS、MacOS 上解码 JXL 或编码 JXL 图片的包。还向 Nuke 和 SDWebImage 提供额外的 JXL 支持。支持较老版本的 iOS、MacOSX 以及不支持 JXL 图片的所有模拟器

基于 libjxl 构建包
项目的主要目标是使用 JXL 图片在所有 Apple 平台(等)上,保持可用的速度和便捷性

为 iOS 11+、Mac OS 11+ 预编译

安装

Swift Package Manager

前往 文件 / Swift 包 / 添加包依赖… 并输入包仓库 URL https://github.com/awxkee/jxl-coder-swift,然后选择写本段时最新的 master 分支。

使用方法

import JXL
// Decompress data
let uiImage: UIImage? = JXLCoder.decode(data: Data()) // or any max CGSize of image
// Compress
let data: Data = try JXLCoder.encode(data: UIImage())

Nuke 插件

如果您希望将 JXLNuke 一起使用,您可以将 JxlCoder 库添加到项目中,并在应用程序初始化时激活插件。

import Nuke
#if canImport(JxlCoder)
import JxlCoder
#endif

public final class JxlNukePlugin: Nuke.ImageDecoding {

    public init() {
    }

    public func decode(_ data: Data) throws -> ImageContainer {
        guard try JXLCoder.isJXL(data: data) else { throw JxlNukePluginDecodeError(failureReason: "Provided data is not JXL") }
        let image = try JXLCoder.decode(data: data)
        return ImageContainer(image: image)
    }

    public func decodePartiallyDownloadedData(_ data: Data) -> ImageContainer? {
        return nil
    }

    public struct JxlNukePluginDecodeError: LocalizedError, CustomNSError {
        public var errorDescription: String {
            "JXL file cannot be decoded"
        }

        public var failureReason: String

        public var errorUserInfo: [String : Any] {
            [NSLocalizedDescriptionKey: "JXL file cannot be decoded", NSLocalizedFailureErrorKey: failureReason]
        }
    }
}

// MARK: - check JXL format data.
extension JxlNukePlugin {

    public static func enable() {
        Nuke.ImageDecoderRegistry.shared.register { (context) -> ImageDecoding? in
            JxlNukePlugin.enable(context: context)
        }
    }

    public static func enable(context: Nuke.ImageDecodingContext) -> Nuke.ImageDecoding? {
        return try? JXLCoder.isJXL(data: context.data) ? JxlNukePlugin() : nil
    }

}

Jxl SDWebImagePlugin

#if canImport(JxlCoder)
import JxlCoder
#endif
import SDWebImage

class JxlSDWebImageCoder: NSObject, SDImageCoder {
    public override init() {
    }
    
    func canDecode(from data: Data?) -> Bool {
        guard let data else {
            return false
        }
        return (try? JXLCoder.isJXL(data: data)) ?? false
    }

    func decodedImage(with data: Data?, options: [SDImageCoderOption : Any]? = nil) -> UIImage? {
        guard let data else {
            return nil
        }
        return try? JXLCoder.decode(data: data)
    }

    func canEncode(to format: SDImageFormat) -> Bool {
        true
    }

    func encodedData(with image: UIImage?, format: SDImageFormat, options: [SDImageCoderOption : Any]? = nil) -> Data? {
        guard let image else {
            return nil
        }
        return try? JXLCoder.encode(image: image)
    }
}

// after register the plugin
SDImageCodersManager.shared.addCoder(JxlSDWebImageCoder())

目前,JXL Nuke 插件不支持动态 JXL 文件,所以您需要自行处理。

免责声明

待办事项

  • 测试
  • 一些例子