我正在使用UIImage(UIImageView)比较Jpeg2000和Jpeg的显示速度,并注意到与Jpeg相比,显示Jpeg2000非常慢。
这是预期的,有没有办法加快速度?
谢谢, -r
答案 0 :(得分:3)
不,你无能为力(除了不使用JPEG 2000)。与纯JPEG文件相比,JPEG 2000需要更多的CPU能力来进行解码和解码。所以即使包括第三方解码器也可能不会带来巨大的改进。
答案 1 :(得分:1)
您可以从JPEG 2000数据创建UIImage。解码过程将比解码JPEG慢,但一旦解码,在UIImageView中显示它应该与任何其他格式一样快。如果您有大量JPEG 2000图像,则可能需要在NSCache中缓存已解码的图像。
答案 2 :(得分:0)
这里提到的一切都是有道理的。然而,JPEG2000的实现对于整个编码/解码过程比标准JPEG编码器/解码器更快。他们通过过多的多线程和NEON加速来实现这一目标。
结帐http://kakadusoftware.com/和https://groups.yahoo.com/neo/groups/kakadu_jpeg2000/conversations/messages 更多细节。图书馆是商业的。有个人/非商业的商业版本和商业版本。为iOS实现它有很多努力。 顺便说一句:Apple为Quicktime和Mac提供了这个API的JPEG2000支持。在某种程度上也是iOS。
答案 3 :(得分:0)
您可以将接收到的图像数据转换为.jpg格式,然后使用这种数据。
import Foundation
import UIKit
import SDWebImageWebPCoder
extension Data {
var jpegData: Data? {
var image: UIImage?
image = UIImage(data: self) ?? SDImageWebPCoder.shared.decodedImage(with: self, options: nil)
return image?.jpegData(compressionQuality: 1.0)
}
}
如果您对使用WepP图像不感兴趣,则不能使用SDImageWepPCoder。 用法示例:
func loadImage(_ url: URL) {
DispatchQueue.global(qos: .background).async { [weak self] in
guard let data = try? Data(contentsOf: url) else {return}
if let jpegData = data.jpegData {
DispatchQueue.main.async {
let displayingImage = UIImage(data: jpegData)
yourImageView.image = displayingImage
}
}
}
}
此决定可以让您在后台线程中将jp2数据转换为JPEG,然后照常使用(渲染速度快,且不会冻结UI)