gpt4 book ai didi

swift - 图像在缓存中占用的空间比 tvos 中的原始大小多

转载 作者:搜寻专家 更新时间:2023-11-01 06:05:49 27 4
gpt4 key购买 nike

不知道为什么我的图像在缓存内存中占用的大小比原始大小大。为此,我正在使用 alamofireImage 库,我的应用程序适用于 tvOS。这是我的代码。

let photoCache = AutoPurgingImageCache(
memoryCapacity: 100 * 1024 * 1024,
preferredMemoryUsageAfterPurge: 60 * 1024 * 1024
)


Alamofire.request(.GET, request, headers: headers)
.responseJSON { response in

if let JSON = response.result.value {
self.imagesArray = JSON["results"] as! NSMutableArray
for result in self.imagesArray{

self.getNetworkImage(result["url"] as! String, completion: { (UIImage) in

})}}}



func getNetworkImage(urlString: String, completion: (UIImage -> Void)) -> (Request) {
return Alamofire.request(.GET, urlString, headers: headers).responseImage { (response) -> Void in
guard let image = response.result.value else { return }
completion(image)
if response.response?.statusCode == 200{
self.cacheImage(image, urlString: urlString)
self.cachedImagesOnly.addObject(urlString)
}
if self.counter == 4{
self.activityIndicatorView.stopAnimating()
self.activityIndicatorView.hidden = true

var downloadedImage = UIImage()
let dicr = self.cachedImagesOnly.firstObject
let urlStringFetch = dicr!["url"] as! String
print("Fetching url: \(urlStringFetch)")

downloadedImage = self.cachedImage(urlStringFetch)!
print("Size of image from cache: \(downloadedImage.size)")
self.ssImage.image = downloadedImage

})

}

}
}

func cacheImage(image: Image, urlString: String) {

print("Total Cache memory size: \(self.photoCache.memoryCapacity)")
self.counter += 1
let jpgImageData = UIImageJPEGRepresentation(image, 1.0)
print("Image size before cache : \(jpgImageData?.length)")
self.cachedImagesOnly.addObject(urlString)
let URLRequest = NSURLRequest(URL: NSURL(string: "\(urlString)")!)
self.photoCache.addImage(UIImage(data: jpgImageData!)!, forRequest: URLRequest)
print("Cache memory usage after image cache: \(self.photoCache.memoryUsage)")

}

记录结果:

Total Cache memory size: 104857600
Image size: (1752.0, 1896.0) and string as identifier: http://image.com/9493.jpg
Image size before cache : Optional(1738247)
Cache memory usage after image cache: 13287168
Total Cache memory size: 104857600
Image size: (2875.0, 3872.0) and string as identifier: http://image.com/5025.jpg
Image size before cache : Optional(7049508)
Cache memory usage after image cache: 57815168
Total Cache memory size: 104857600
Image size: (2394.0, 3866.0) and string as identifier: http://image.com/169215.jpg
Image size before cache : Optional(6049349)
Cache memory usage after image cache: 94835984
Total Cache memory size: 104857600
Image size: (3811.0, 3049.0) and string as identifier: http://image.com/786.jpg
Image size before cache : Optional(2848557)
Cache memory usage after image cache: 46478956

所以,我在 GitHub 上读到,当缓存内存已满时,他们使用 FIFO,因此除了仅删除第一个对象外,它会根据计算删除两个或三个对象。此外,仅考虑第一个日志结果,图像大小为 1738247,IDK 这增加了多少开销,缓存后使用大小变为 13287168,这几乎是 13 倍,非常奇怪。如果有人遇到过这个问题或可以识别我的错误,将不胜感激。提前致谢。

最佳答案

这有点复杂,因为这里有很多事件部件:

  • 首先,当您从 Web 服务获取图像时,存在原始 Assets ,NSData。在您的代码片段中,我认为您从未见过这个原始 Assets ,因为您让 Alamofire 在将其交付给您之前将其转换为 UIImage(请参阅下一点)。但是,如果您是在网络浏览器(或 Charles 或 WireShark 等工具)中观看的,这就是原始 Assets 的大小。

  • 然后将其转换为 UIImage,如果原始 Assets 被压缩,它可能会保持压缩状态,直到您第一次在 UIImageView 或类似的地方使用它.

    一旦您使用此 UIImage,它就会被解压缩,通常会占用更多的内存,通常每个像素四个字节(一个字节分别用于红色、绿色、蓝色和 alpha channel ,尽管有也有其他格式)。

  • 当您稍后调用 UIImageJPEGRepresentation 时,您现在正在从 UIImage 构建一个新的 NSData。人们常常错误地认为这与原始 Assets 相同,但事实并非如此。如果您使用 1.0 的压缩质量,这通常比原始 Assets 大得多(尽管可能比未压缩的 UIImage 小)。如果您使用较低的压缩质量,则大小通常更合理,但是由于其有损压缩,您引入了一些 JPEG 伪像。 (PNG 压缩是无损的,但通常生成的 Assets 更大。)

总而言之,您正在比较 NSData 表示(特别是 compressionQuality 为 1 的 JPEG)与 UIImage 已缓存,我不希望这些数字匹配。它们是非常不同的东西。

关于swift - 图像在缓存中占用的空间比 tvos 中的原始大小多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38166075/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com