12

我已经彻底阅读了最新的 iOS8 相框作品,我正在尝试从用户库中获取一些资产以进行显示。我让用户一次编辑 4 张图像。但正因为如此,我需要压缩图像,否则应用程序会崩溃。

我正在使用 PHImageManager 通过以下代码加载图像:

func processImages()
    {
        println("Processing")
        _selectediImages = Array()
        _cacheImageComplete = 0
        for asset in _selectedAssets
        {
            var options:PHImageRequestOptions = PHImageRequestOptions()
            options.version = PHImageRequestOptionsVersion.Unadjusted
            options.synchronous = true
            var minRatio:CGFloat = 1
            if(CGFloat(asset.pixelWidth) > UIScreen.mainScreen().bounds.width || CGFloat(asset.pixelHeight) > UIScreen.mainScreen().bounds.height)
            {
               minRatio = min(UIScreen.mainScreen().bounds.width/(CGFloat(asset.pixelWidth)), (UIScreen.mainScreen().bounds.height/CGFloat(asset.pixelHeight)))
            }
            var size:CGSize = CGSizeMake((CGFloat(asset.pixelWidth)*minRatio),(CGFloat(asset.pixelHeight)*minRatio))
            println("Target size is \(size)")
            PHImageManager.defaultManager().requestImageForAsset(asset, targetSize:size, contentMode: .AspectFill, options: options)
                {
                    uiimageResult, info in
                    var image = iImage(uiimage: uiimageResult)
                    println("Result Size Is \(uiimageResult.size)")
            }

        }

    }

如您所见,我正在计算目标尺寸以确保图像至少不大于屏幕。如果是,我会在图像上按比例缩小。然而,这是一个典型的打印日志

目标大小为 (768.0,798.453531598513) 结果大小为 (1614.0,1678.0)

即使我将目标大小设置为 768x798(在这种特定情况下),它给我的结果 UIImage 是它的两倍多。现在根据文档,targetSize 参数

“要返回的图像的目标大小。”

不是最清楚的解释,但从我的实验来看,它与此不符。

如果你有一些建议,我很想听听!

4

4 回答 4

10

Swift,你想做这样的事情:

var asset: PHAsset!
var imageSize = CGSize(width: 100, height: 100)

var options = PHImageRequestOptions()
options.resizeMode = PHImageRequestOptionsResizeMode.Exact
options.deliveryMode = PHImageRequestOptionsDeliveryMode.Opportunistic

PHImageManager.defaultManager().requestImage(asset, targetSize: imageSize, contentMode: PHImageContentMode.AspectFill, options: options) {
    (image, info) -> Void in
    // what you want to do with the image here
    print("Result Size Is \(image.size)")

}

Objective-C中,它看起来像这样:

void (^resultHandler)(UIImage *, NSDictionary *) = ^(UIImage *result, NSDictionary *info) {
    // what you want to do with the image

};

CGSize cellSize = CGSizeMake(100, 100);

PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.resizeMode = PHImageRequestOptionsResizeModeExact;
options.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;

[[PHImageManager defaultManager] requestImageForAsset:self.imageAsset targetSize:cellSize contentMode:PHImageContentModeAspectFill options:options resultHandler:resultHandler];

重要提示:使用Opportunistic交付模式,结果块可能会以不同的大小被多次调用,但最后一次调用将是您想要的大小。最好使用Opportunistic,这样 UI 将首先加载一个低质量的占位符,然后更新它,因为操作系统可以生成更好的图像(而不是有一个空白方块)。

于 2015-09-01T23:46:17.677 回答
9

这是因为requestImageForAsset会被调用两次。

第一次,它将返回一个非常相同大小的图像,例如 (60 * 45),我认为这是该图像的缩略图。

第二次,您将获得全尺寸图像。

我用

if ([[info valueForKey:@"PHImageResultIsDegradedKey"]integerValue]==0){ // Do something with the FULL SIZED image } else { // Do something with the regraded image }

来区分两个不同的图像。

参考:iOS 8 PhotoKit。从 iCloud 照片共享相册中获取最大尺寸的图像

于 2015-10-09T20:35:47.300 回答
6

尝试将 resizeMode 设置为PHImageRequestOptionsResizeModeExact并将 deliveryMode 设置为PHImageRequestOptionsDeliveryModeHighQualityFormat;

PHImageRequestOptionsResizeModeExact, 
// same as above but also guarantees the delivered image is exactly targetSize (must be set when a normalizedCropRect is specified)
于 2014-10-31T00:59:20.943 回答
3

您可以将PHImageManagerMaximumSizetargetSize用作PHImageManager请求。

根据文档中的PHImageManagerMaximumSize请求原始图像或可用的最大渲染图像时传递的大小(resizeMode 将被忽略)

于 2016-06-12T06:58:25.127 回答