gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:11:04 26 4
gpt4 key购买 nike

我的公司在通过获取 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 targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeDefault 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 大小?感谢您的帮助

最佳答案

这是由于 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<PHAssetResource *> *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 options:options 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/

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