JxlCoder
这是什么?
此包为所有苹果平台提供对 JXL 图像的支持。支持以便捷的方式编码和解码 JXL 图像
一个用于在 iOS、MacOS 或编码 JXL 图像的包。还为 Nuke 和 SDWebImage 提供了 JXL 支持。支持旧版本的 iOS、MacOSX 以及不支持 JXL 图像的所有模拟器
基于 libjxl
开发的包
项目的主要目标是使用在所有 Apple 平台上使用 JXL
图像等,以可用的速度和便捷性
已预编译支持 iOS 11+、Mac OS 11+
安装
Swift包管理器
转到“文件/ Swift包/ 添加包依赖…”,输入包仓库URL https://github.com/awxkee/jxl-coder-swift,然后选择撰写这篇文档时的最新master分支。
使用方法
import JxlCoder
// 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插件
如果您希望使用JXL
与Nuke
配合,您可以在项目中添加JxlCoder
库并激活插件
JxlNukePlugin
在您的项目中使用以下代码或添加pod import Nuke
#if canImport(JxlCoder)
import JxlCoder
#endif
public final class JxlNukePlugin: Nuke.ImageDecoding {
public init() {
}
public func decode(_ data: Data) -> ImageContainer? {
guard (try? JXLCoder.isJXL(data: data)) ?? false else { return nil }
guard let image = try? JXLCoder.decode(data: data) else {
return nil
}
return ImageContainer(image: image)
}
public func decodePartiallyDownloadedData(_ data: Data) -> ImageContainer? {
return nil
}
}
// 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
}
}
// 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
JxlSDWebImageCoder
使用提供的代码或包含 pod #if canImport(JxlCoder)
import JxlCoder
#endif
import SDWebImage
public class JxlSDWebImageCoder: NSObject, SDImageCoder {
public override init() {
}
public func canDecode(from data: Data?) -> Bool {
guard let data else {
return false
}
return (try? JXLCoder.isJXL(data: data)) ?? false
}
public func decodedImage(with data: Data?, options: [SDImageCoderOption : Any]? = nil) -> UIImage? {
guard let data else {
return nil
}
return try? JXLCoder.decode(data: data)
}
public func canEncode(to format: SDImageFormat) -> Bool {
true
}
public 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,所以您需要自己完成
免责声明
待办
- 测试
- 一些例子