gpt4 book ai didi

iOS 8 从 PHAsset 快速加载图像

转载 作者:搜寻专家 更新时间:2023-10-31 21:52:42 24 4
gpt4 key购买 nike

我有一个应用程序可以让人们组合最多 4 张图片。然而,当我让他们从他们的照片中选择(最多 4 张)时,即使我将图像质量设置为 FastFormat,速度也会非常慢。这将需要 4 秒(每张照片约 1 秒)。在最高质量下,4 张图像需要 6 秒。

无论如何,你能建议我更快地输出图像吗?

这是我处理图像的 block 。

func processImages()
{
_selectediImages = Array()
_cacheImageComplete = 0
for asset in _selectedAssets
{
var options:PHImageRequestOptions = PHImageRequestOptions()
options.synchronous = true
options.deliveryMode = PHImageRequestOptionsDeliveryMode.FastFormat
PHImageManager.defaultManager().requestImageForAsset(asset, targetSize:CGSizeMake(CGFloat(asset.pixelWidth), CGFloat(asset.pixelHeight)), contentMode: .AspectFit, options: options)
{
result, info in
var minRatio:CGFloat = 1
//Reduce file size so take 1/3 the screen w&h
if(CGFloat(asset.pixelWidth) > UIScreen.mainScreen().bounds.width/2 || CGFloat(asset.pixelHeight) > UIScreen.mainScreen().bounds.height/2)
{
minRatio = min((UIScreen.mainScreen().bounds.width/2)/(CGFloat(asset.pixelWidth)), ((UIScreen.mainScreen().bounds.height/2)/CGFloat(asset.pixelHeight)))
}
var size:CGSize = CGSizeMake((CGFloat(asset.pixelWidth)*minRatio),(CGFloat(asset.pixelHeight)*minRatio))
UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
result.drawInRect(CGRectMake(0, 0, size.width, size.height))
var final = UIGraphicsGetImageFromCurrentImageContext()
var image = iImage(uiimage: final)
self._selectediImages.append(image)
self._cacheImageComplete!++
println(self._cacheImageComplete)
if(self._cacheImageComplete == self._selectionCount)
{
self._processingImages = false
self.selectionCallback(self._selectediImages)
}
}

}
}

最佳答案

不要自己调整图像的大小 — PHImageManager 的部分功能就是为您做这件事。 (它还会缓存缩略图图像,以便您下次可以更快地获取它们,并在应用程序之间共享该缓存,这样您就不会最终有六个应用程序为整个库创建六个单独的 500MB 缩略图缓存。 )

func processImages() {
_selectediImages = Array()
_cacheImageComplete = 0
for asset in _selectedAssets {
let options = PHImageRequestOptions()
options.deliveryMode = .FastFormat

// request images no bigger than 1/3 the screen width
let maxDimension = UIScreen.mainScreen().bounds.width / 3 * UIScreen.mainScreen().scale
let size = CGSize(width: maxDimension, height: maxDimension)

PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: size, contentMode: .AspectFill, options: options)
{ result, info in
// probably some of this code is unnecessary, too,
// but I'm not sure what you're doing here so leaving it alone
self._selectediImages.append(result)
self._cacheImageComplete!++
println(self._cacheImageComplete)
if self._cacheImageComplete == self._selectionCount {
self._processingImages = false
self.selectionCallback(self._selectediImages)
}
}
}
}
}

显着变化:

  • 不要在主线程上同步请求图像。只是不要。
  • 将方形最大尺寸传递给 requestImageForAsset 并使用 AspectFill 模式。这将为您提供一张图片,无论其宽高比是多少,该图片都会被裁剪以填充该正方形。
  • 您在这里按像素大小请求图像,屏幕大小以磅为单位。乘以屏幕比例,否则您的图像将被像素化。 (话又说回来,您要求的是 FastFormat,所以无论如何您都可能会得到模糊的图像。)

关于iOS 8 从 PHAsset 快速加载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27408374/

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