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 插件
如果您希望将 JXL
与 Nuke
一起使用,您可以将 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 文件,所以您需要自行处理。
免责声明
待办事项
- 测试
- 一些例子