【问题标题】:How to know if a PHAsset has been modified?如何知道 PHAsset 是否已被修改?
【发布时间】:2014-12-26 12:03:57
【问题描述】:

更具体地说,您如何知道PHAsset 的当前版本的基础资产是否与原始版本不同?

我的用户只需要在必要时在当前资产或原始资产之间进行选择。然后我需要他们对PHImageRequestOptions.version 的答复。

【问题讨论】:

    标签: ios objective-c photos photokit


    【解决方案1】:

    我找到了一种方法来确定PHAsset 是否已被编辑。使用PHAssetResource API,您可以获得给定资产的数据资源数组。如果照片被修改过,它至少有一个资源是编辑的调整数据。

    let isEdited = PHAssetResource.assetResources(for: asset).contains(where: { $0.type == .adjustmentData })
    

    请注意,如果您想实际使用资源文件,则必须使用PHAssetResourceManager API 获取其数据。另请注意,此方法会立即返回 - 与此处的其他答案不同,无需等待异步网络请求。

    【讨论】:

      【解决方案2】:

      我找到了两种检查 PHAsset 是否有修改的方法。

      - (void)tb_checkForModificationsWithEditingInputMethodCompletion:(void (^)(BOOL))completion {
          PHContentEditingInputRequestOptions *options = [PHContentEditingInputRequestOptions new];
          options.canHandleAdjustmentData = ^BOOL(PHAdjustmentData *adjustmentData) { return YES; };
          
          [self requestContentEditingInputWithOptions:options completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
              if (completion) completion(contentEditingInput.adjustmentData != nil);
          }];
      }
       
      - (void)tb_checkForModificationsWithAssetPathMethodCompletion:(void (^)(BOOL))completion {
          PHVideoRequestOptions *options = [PHVideoRequestOptions new];
          options.deliveryMode = PHVideoRequestOptionsDeliveryModeFastFormat;
          
          [[PHImageManager defaultManager] requestAVAssetForVideo:self options:options resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) {
              if (completion) completion([[asset description] containsString:@"/Mutations/"]);
          }];
      }
      

      编辑:我当时需要为带有图像的 PHAsset 提供相同的功能。我用这个:

      - (void)tb_checkForModificationsWithAssetPathMethodCompletion:(void (^)(BOOL))completion {
          [self requestContentEditingInputWithOptions:nil completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
              NSString *path = (contentEditingInput.avAsset) ? [contentEditingInput.avAsset description] : contentEditingInput.fullSizeImageURL.path;
              completion([path containsString:@"/Mutations/"]);
           }];
      }
      

      【讨论】:

      • 这些解决方案依赖于 Photos 框架的实现细节。如另一个答案中所述,测试资产的 adjustmentData 是一种直接查询修改的方法 - 应该使用该方法。
      【解决方案3】:

      看看PHImageRequestOptionsVersion

      PHImageRequestOptionsVersionCurrent

      请求图片资源的最新版本(反映所有编辑的版本)。 生成的图像是之前所有调整的渲染输出。

      PHImageRequestOptionsVersionUnadjusted

      请求未经调整的图像资源版本。
      如果资产已被编辑,则生成的图像会反映资产在执行任何编辑之前的状态。

      PHImageRequestOptionsVersionOriginal

      请求图片资源的原始、最高保真版本。这 生成的图像最初是捕获或导入的版本 资产,无论进行任何编辑。

      如果您在检索资产之前询问用户,您就知道用户指定了哪个版本。如果您从其他地方获得 phasset,您可以执行 revertAssetContentToOriginal 来获取原始资产。而 PHAsset 具有 modifyDate 和 creationDate 属性,您可以使用它来判断 PHAsset 是否被修改。

      【讨论】:

      • 我已经更新了问题,我需要正确创建 PHImageRequestOptions 的信息。
      • Documentation: Photos updates the modification date when an asset’s image or video content or metadata changes. 所以当你喜欢一张图片时,修改日期也会改变。
      • 经过测试发现,收藏图片并没有改变modificationDate,但是修改后恢复为原始图像不会将modificationDate恢复为creationDate,所以比较日期不是解决方案。
      【解决方案4】:

      我发现这段代码是目前唯一有效的代码,它可以处理大多数边缘情况。它可能不是最快的,但适用于大多数图像类型。它采用尽可能小的原始图像和修改图像并比较它们的数据内容。

      @implementation PHAsset (Utilities)
      - (void)checkEditingHistoryCompletion:(void (^)(BOOL edited))completion
      {
          PHImageManager *manager = [PHImageManager defaultManager];
      
          CGSize compareSize = CGSizeMake(64, 48);
      
          PHImageRequestOptions *requestOptions = [PHImageRequestOptions new];
          requestOptions.synchronous = YES;
          requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat;
          requestOptions.version = PHImageRequestOptionsVersionOriginal;
      
          [manager requestImageForAsset:self
                             targetSize:compareSize
                            contentMode:PHImageContentModeAspectFit
                                options:requestOptions
                          resultHandler:^(UIImage *originalResult, NSDictionary *info) {
      
                              UIImage *currentImage = originalResult;
      
                              requestOptions.version = PHImageRequestOptionsVersionCurrent;
      
                              [manager requestImageForAsset:self
                                                 targetSize:currentImage.size
                                                contentMode:PHImageContentModeAspectFit
                                                    options:requestOptions
                                              resultHandler:^(UIImage *currentResult, NSDictionary *info) {
      
                                                  NSData *currData = UIImageJPEGRepresentation(currentResult, 0.1);
                                                  NSData *orgData = UIImageJPEGRepresentation(currentImage, 0.1);
      
                                                  if (completion) {
      
                                                      //handle case when both images cannot be retrived it also mean no edition
                                                      if ((currData == nil) && (orgData == nil)) {
                                                          completion(NO);
                                                          return;
                                                      }
      
                                                      completion(([currData isEqualToData:orgData] == NO));
                                                  }
                                              }];
                          }];
      }
      
      @end
      

      【讨论】:

      • 您的解决方案仅适用于图像。接受答案的第二个代码块(编辑后的那个)对您不起作用?
      • 不幸的是没有:/即使在修改后我也会收到常规路径,例如:path NSString * @"/var/mobile/Media/DCIM/100APPLE/IMG_0736.PNG" 0x15d683d0
      猜你喜欢
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      相关资源
      最近更新 更多