Obj-C 检查照片库中是否已存在图像

2023-12-15

在我的应用程序中,我必须实现保存图像功能。我已经成功地保存了这样的内容:

  UIImage *image = [UIImage imageNamed:actualBackground];
  UIImageWriteToSavedPhotosAlbum(
      image, self,
      @selector(thisImage:hasBeenSavedInPhotoAlbumWithError:usingContextInfo:),
      nil);

/* ... */

- (void)thisImage:(UIImage *)image
    hasBeenSavedInPhotoAlbumWithError:(NSError *)error
                     usingContextInfo:(void *)ctxInfo {
  if (!error){
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    [self presentViewController:picker animated:YES completion:nil];
  }
}

不幸的是我必须检查文件是否已经存在以防止冗余保存。这也是必要的,因为多次保存同一图像不会覆盖一个文件,但它会创建它的副本......

你知道如何解决这个问题吗?

解决方案:

根据Shravya Boggarapu回答我将 assetUrl 存储在我的NSUserDefaults。完整代码:

- (IBAction)onDownloadClick:(UIButton *)sender {
  UIImage *image = [UIImage imageNamed:actualBackground];

  NSString *key = [NSString stringWithFormat:@"assetsUrl %@", actualBackground];
  NSString *savedValue =
      [[NSUserDefaults standardUserDefaults] stringForKey:key];
  NSURL *url = [NSURL URLWithString:savedValue];
  if (url != nil) {
    PHFetchResult *fetch =
        [PHAsset fetchAssetsWithALAssetURLs:[NSArray arrayWithObject:url]
                                    options:nil];
    if ([fetch count]) {
      UIAlertView *myAlert = [[UIAlertView alloc]
              initWithTitle:nil
                    message:NSLocalizedString(@"Already downloaded", nil)
                   delegate:self
          cancelButtonTitle:@"OK"
          otherButtonTitles:nil];
      [myAlert show];
      return;
    }
  }
  ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

  [library
      writeImageToSavedPhotosAlbum:image.CGImage
                       orientation:(ALAssetOrientation)image.imageOrientation
                   completionBlock:^(NSURL *assetURL, NSError *error) {

                     [library assetForURL:assetURL
                         resultBlock:^(ALAsset *asset) {
                           NSLog(@"assetURL %@", assetURL);
                           NSString *ass = [assetURL absoluteString];
                           [[NSUserDefaults standardUserDefaults]
                               setObject:ass
                                  forKey:key];
                           [[NSUserDefaults standardUserDefaults] synchronize];

                           UIAlertView *myAlert = [[UIAlertView alloc]
                                   initWithTitle:nil
                                         message:NSLocalizedString(
                                                     @"Image downloaded", nil)
                                        delegate:self
                               cancelButtonTitle:@"OK"
                               otherButtonTitles:nil];
                           [myAlert show];
                         }
                         failureBlock:^(NSError *error){
                         }];
                   }];
}

希望它能帮助别人。


我有一个解决方案,但不适用于所有情况。

将图像保存到相机胶卷的问题是,将图像添加到相机胶卷时会创建一个 assetURL。此外,该资源 URL 每次都是新的,因此如果您保存到相机胶卷,它将创建一个副本。图像的名称也不会保留。

如果图像首先通过您的应用程序添加到相机胶卷,那么您可以将 assetURL 存储为图像信息的一部分。

在我的应用程序中,为包含一些关键信息的每个图像维护一个字典。如果图像保存到相机胶卷,则这包括图像的 assetURL。

获得 URL 后,您可以使用以下命令检查其是否存在fetchAssetsWithALAssetURLs:options:功能。

如果 URL 为 nil 或获取时的 asset 为 nil,则表示相机胶卷中不存在该图像。所以你可以重新添加。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Obj-C 检查照片库中是否已存在图像 的相关文章

随机推荐

  • 401 第二次 HttpClient/HttpWebRequest 调用未经授权

    我有一个使用 SharePoint 2010 REST API 的应用程序 在创建一个 Item 的过程中 有多个请求相继完成 1 次调用 从列表中获取项目 成功 2 调用 创建项目 401 未经授权 如果我这样做是一样的 1 次调用 创建
  • 以高值为中心的对数正态随机数

    我正在尝试使用 numpy scipy 从对数正态分布创建随机数 平均值为 2000 西格玛为 800 如果我使用 numpy random lognormal mean 2000 sigma 800 size 10000 创建随机值 我得
  • R:GLMM 的连续变量和分类变量的交互图 (lme4)

    我想制作一个交互图 以直观地显示回归模型结果中分类变量 4 个级别 和标准化连续变量交互斜率的差异或相似性 with GLMModel interaction plot continuous var categorical var resp
  • MySQL:如何在客户端和服务器端启用本地加载数据

    我尝试将 txt 文件上传到 MySQL Workbench 但遇到以下问题 错误代码 3948 加载本地数据被禁用 必须在客户端和服务器端启用此功能 Workbench 使用 MySQL 的一个功能 称为加载数据本地对于此 txt 文件导
  • 为什么Qhull在计算几个点的凸包时会出错?

    我正在尝试计算 10 维空间中 9 个点的凸包 通过 scipy 接口 我调用scipy spatial ConvexHull points 并得到QH6214 qhull input error not enough points 9 t
  • 如何检查 numpy 数组列表是否包含给定的测试数组?

    我有一个清单numpy数组 比如说 a np random rand 3 3 np random rand 3 3 np random rand 3 3 我有一个测试数组 比如说 b np random rand 3 3 我想检查是否a包含
  • 使用 fwrite() 删除数据

    我为了好玩写了一个非常简单的文件损坏器 但令我惊讶的是 损坏 的文件最终比原始文件小 这是应该替换字节但不删除它们的损坏函数 void corruptor char inputname int percent FILE input FILE
  • 扩大堆大小C++

    有没有办法扩大 C 程序的堆大小 在 android 中 您可以通过在清单文件中将其声明为 Large 来轻松做到这一点 当我尝试在堆上分配十亿个数组元素时 我遇到了这个问题 int main int size 1000000000 int
  • android 动画列表中出现 OutOfMemory 错误

    我的绘图中有大约 100 多个图像 帧 每个图像的大小都是 1 5 kbs 分辨率为 480 x 272 现在 当我在动画列表 xml 中添加这些图像 帧 并尝试运行它时 我收到此 OutOfMemory 错误 我已在互联网上搜索 但找不到
  • “child_added”和“value”firebase 之间的区别?

    我发现两者之间有一点区别child added and value在 firebase 中返回数据时 使用value我可以测试一下是否snapshot val 已经返回了一些东西或者没有像这样使用它 获取数据 ref orderByChil
  • 重置并重新启动pygame程序不起作用

    当要求用户重新启动时 我在 pygame 中重置游戏时遇到问题 该程序的构造如下 import board as b class Gui def init self pygame init self gamestate b GameStat
  • 从文件中读取行,迭代每一行和该行中的每个字符

    我需要读取一个文件 获取每一行 迭代每一行并检查该行是否包含 aeiuo 中的任何字符以及是否包含至少 2 个字符 这段代码是 Rust 惯用的吗 如何检查一个文件中是否有多个字符String 到目前为止 我在谷歌和代码窃取方面的尝试 us
  • Kivy 安装出错 - Windows 10(以前可以工作,但在 gstreamer 之后就不行了)

    尝试在 Windows 10 中安装 Kivy 使用以下命令安装基础知识 python m pip install upgrade pip wheel setuptools python m pip install docutils pyg
  • NSOperations 队列和处理应用程序退出

    我即将创作一系列NSOperations 并在队列中运行它们 它们都是连续的并且一次运行一个 这些操作将从网络获取数据并创建和保存核心数据管理对象 应用程序退出的情况如何处理 由于操作在分离线程中运行 如何让主线程等待 直到当前操作 安全
  • iOS 中当年的天数

    我想找到今年今天的天数 例如 如果今天是 2012 年 3 月 15 日 我应该得到 75 31 29 15 或者我们可以简单地说今天到当年 1 月 1 日之间的天数 Use the ordinalityOfUnit的方法NSCalenda
  • php5 mail()函数sendmail错误

    我正在尝试使用 php 的 mail 函数 但不断收到错误 我已经通过安装了sendmailsudo apt get install sendmail 编辑了我的 etc php5 cli php ini文件将以下文本添加到这些行 send
  • 为什么 `define?` 返回字符串或 nil?

    在红宝石中 为什么会defined 返回一个字符串 大多数其他 Ruby 方法以 返回一个布尔值 这是为了支持功能请求而进行的黑客攻击 还是故意滥用 ruby 约定 为什么 例子 defined super gt super defined
  • Facebook登录成功后如何获取用户详细信息

    我尝试了这个 当 isSessionValid getDetails 直接 else facebook authorize 然后 getDetails 在 onActivityResult public class MainActivity
  • ggplot2 中的分面

    我有这个数据集 https dl dropboxusercontent com u 73950 data csv数据集包含 3 个变量 以下是我现在可视化数据的方式 library ggplot2 library reshape2 libr
  • Obj-C 检查照片库中是否已存在图像

    在我的应用程序中 我必须实现保存图像功能 我已经成功地保存了这样的内容 UIImage image UIImage imageNamed actualBackground UIImageWriteToSavedPhotosAlbum ima