JxlCoder
这是什么?
本包为所有苹果平台提供对 JXL(JPEG XL)图像的支持。以方便快捷的方式支持编码和解码 JXL 图像
一个用于在 iOS、MacOS 上解码 JXL 或编码 JXL 图像的包。还提供了 Nuke 和 SDWebImage 的 JXL 支持。支持旧版本的 iOS、MacOSX 以及不支持 JXL 图像的所有模拟器
支持 ICC 配置文件和 HDR 图像。
基于 libjxl
的包
此项目的主要目标是使用 JXL 图像在所有苹果平台上等,以实用和方便的速度
预编译,支持 iOS 11+、Mac OS 11+
安装
Swift Package Manager
转到 文件 / 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 插件
如果您希望在 Nuke
中使用 JXL
,可以将 JxlCoder
库添加到项目中,并在应用初始化时激活插件。
JxlNukePlugin
在您的项目中使用下面的代码,或添加 pod public final class JxlNukePlugin: Nuke.ImageDecoding {
public func decode(_ data: Data) throws -> Nuke.ImageContainer {
guard try JXLCoder.isJXL(data: data) else { throw JXLNukePluginDecodeError() }
let image = try JXLCoder.decode(data: data)
return ImageContainer(image: image)
}
public init() {
}
public func decodePartiallyDownloadedData(_ data: Data) -> ImageContainer? {
return nil
}
}
public struct JXLNukePluginDecodeError: LocalizedError, CustomNSError {
public var errorDescription: String? {
"JXL file cannot be decoded"
}
public var errorUserInfo: [String : Any] {
[NSLocalizedDescriptionKey: "JXL file cannot be decoded"]
}
}
// 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,因此您需要自己完成该任务。
免责声明
JPEG XL 倡议书讨论了下一代图像压缩标准的需求,该标准相比 JPEG 具有显著更好的压缩效率(提高 60%)。预计该标准将优于 HEIC、AVIF、WebP 和 JPEG 2000 显示的静态图像压缩性能。它还提供了对传统/传统 JPEG 格式的图像进行高效无损重新压缩的选项。
JPEG XL 支持高达 1 太像素的超高分辨率图像的有损和无损压缩,每组件最高 32 位,最多 4099 个组件(包括 alpha 透明度),动画图像和嵌入预览。它还具有针对 Web 交付的特性,如高级渐进解码[13] 和最小头部开销,以及针对图像编辑和数字印刷的特性,如支持多个图层、CMYK 和专色。它专门设计用于无缝处理具有高动态范围的颜色空间,例如 Rec. 2100(具有 PQ 或 HLG 转换函数)的高色彩域。
待办事项
- 测试
- 一些示例