UIImage(UIImageView)を使用してJpeg2000とJpegの表示速度を比較していたところ、Jpeg2000の表示がJpegに比べてかなり遅いことに気づきました。
これは予想されることであり、それをスピードアップする方法はありますか?
ありがとう、-r
いいえ、それについてできることは何もありません(もちろん、JPEG 2000を使用しないことを除いて)。JPEG 2000は、プレーンなJPEGファイルよりもエンコードとデコードにはるかに多くのCPUパワーを必要とします。したがって、サードパーティのデコーダーを含めても、おそらく大きな改善はもたらされません。
JPEG2000データからUIImageを作成できます。デコードプロセスはJPEGのデコードよりも遅くなりますが、デコードされたら、UIImageViewでの表示は他の形式と同じくらい高速である必要があります。JPEG 2000画像がたくさんある場合は、デコードされた画像をNSCacheにキャッシュすることをお勧めします。
ここで言及されたすべては幾分真実です。ただし、標準のJPEGエンコーダー/デコーダーよりもエンコード/デコードプロセス全体で高速なJPEG2000の実装があります。彼らは過度のマルチスレッドとNEONアクセラレーションでそれを達成します。
詳細については、 http://kakadusoftware.com/およびhttps://groups.yahoo.com/neo/groups/kakadu_jpeg2000/conversations/messagesを確認して ください。ライブラリは商用です。ビジネスバージョンと個人/非商用バージョンがあります。iOS用にそれを実装するためにかなりの努力があります。ところで:AppleはQuicktimeとMac用のこのAPIだけでJPEG2000サポートを提供しています。ある程度iOSも。
受信した画像データを.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がフリーズすることはありません)