• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

iOS Photokit - PHAsset pixelWidth 和 pixelHeight 与高分辨率图像不匹配

[复制链接]
菜鸟教程小白 发表于 2022-12-11 19:33:41 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我的公司在通过获取 PHAsset 获取正确大小的元数据方面遇到了很大问题。 我们开发了一个 iOS 应用程序,允许客户从库中选择图片,获取每个图片的大小(以像素为单位),计算坐标以调整我们销售的小工具,然后将高质量的图片版本上传到我们的服务器以打印小工具。 对于我们的一些客户,问题在于发送的一些高质量版本图片的像素大小与 PHAsset 对象给出的 pixelWidth 和 pixelHeight 不匹配。 举个例子,我们有一张图片:

  • PHAsset 对象报告为 2096x3724
  • 但是,当请求全尺寸图片时,会生成一张 1536x2730 的图片

图片不在 iCloud 中,由运行 iOS 10.2 的 iPhone 6 SE 发送。 这是获取全尺寸图像版本的代码:

PHImageRequestOptions *imgOpts = [[PHImageRequestOptions alloc] init];
imgOpts.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
imgOpts.networkAccessAllowed = YES;
imgOpts.resizeMode = PHImageRequestOptionsResizeModeExact;
imgOpts.version = PHImageRequestOptionsVersionCurrent;  

PHCachingImageManager *imageManager = [[PHCachingImageManager alloc] init];

[imageManager requestImageForAsset:imageAsset targetSizeHImageManagerMaximumSize contentModeHImageContentModeDefault options:imgOpts resultHandler:^(UIImage *  result, NSDictionary *  info) {
    NSData * imageData = UIImageJPEGRepresentation(result, 0.92f);
    //UPLOAD OF imageData TO SERVER HERE
}]

也尝试了 requestImageDataForAsset 方法,但没有运气:

PHImageRequestOptions *imgOpts = [[PHImageRequestOptions alloc] init];
imgOpts.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
imgOpts.networkAccessAllowed = YES;
imgOpts.resizeMode = PHImageRequestOptionsResizeModeExact;
imgOpts.version = PHImageRequestOptionsVersionCurrent;  

PHCachingImageManager *imageManager = [[PHCachingImageManager alloc] init];

[imageManager requestImageDataForAsset:imageAsset options:imgOpts resultHandler:^(NSData * imageData, NSString * dataUTI, UIImageOrientation orientation, NSDictionary *  info) {
    //UPLOAD OF imageData TO SERVER HERE
}]

在上传之前从每张图片的高分辨率版本中获取精确尺寸对我们来说不是一个选项,因为从库中选择大量 Assets 时会大大降低性能。

我们是错过了还是做错了什么? 有没有办法在不将全分辨率图像加载到内存的情况下以像素为单位获取 Assets 大小? 感谢您的帮助



Best Answer-推荐答案


这是由于 Photos 框架中的错误造成的。有关该错误的详细信息可以找到here .

有时,在编辑照片后,会创建一个较小的版本。这只发生在一些较大的照片上。

调用 requestImageForAsset:(使用 PHImageManagerMaximumSize)或 requestImageDataForAsset:(使用 PHImageRequestOptionsDeliveryModeHighQualityFormat)将读取数据从较小的文件版本中,尝试检索已编辑的版本 (PHImageRequestOptionsVersionCurrent)。

上述方法回调中的info会指向图片的路径。举个例子:
PHImageFileURLKey = "file:///[...]DCIM/100APPLE/IMG_0006/Adjustments/IMG_0006.JPG";
检查该文件夹后,我找到了另一张图片,FullSizeRender.jpg - 此图片具有完整尺寸并包含最新的编辑。因此,当存在这样的文件时,一种方法是尝试从 FullSizeRender.jpg 中读取。


从 iOS 9 开始,还可以使用 PHAssetResourceManager 以最高分辨率获取最新编辑:

// if (@available(iOS 9.0, *)) {
// check if a high quality edit is available
NSArray<HAssetResource *> *resources = [PHAssetResource assetResourcesForAsset:_asset];
PHAssetResource *hqResource = nil;
for (PHAssetResource *res in resources) {
    if (res.type == PHAssetResourceTypeFullSizePhoto) {
        // from my tests so far, this is only present for edited photos
        hqResource = res;
        break;
    }
}

if (hqResource) {
    PHAssetResourceRequestOptions *options = [[PHAssetResourceRequestOptions alloc] init];
    options.networkAccessAllowed = YES;
    long long fileSize = [[hqResource valueForKey"fileSize"] longLongValue];
    NSMutableData *fullData = [[NSMutableData alloc] initWithCapacity:fileSize];

    [[PHAssetResourceManager defaultManager] requestDataForAssetResource:hqResource optionsptions dataReceivedHandler:^(NSData * _Nonnull data) {
        // append the data that we're receiving
        [fullData appendData:data];
    } completionHandler:^(NSError * _Nullable error) {
        // handle completion, using `fullData` or `error`
        // uti == hqResource.uniformTypeIdentifier
        // orientation == UIImageOrientationUp
    }];
}
else {
    // use `requestImageDataForAsset:`, `requestImageForAsset:` or `requestDataForAssetResource:` with a different `PHAssetResource`
}

关于iOS Photokit - PHAsset pixelWidth 和 pixelHeight 与高分辨率图像不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43589494/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap