【问题标题】:Save image that is displayed in UIImage and categorize it保存 UIImage 中显示的图像并对其进行分类
【发布时间】:2013-08-11 12:23:09
【问题描述】:

我想保存显示在UIImage 中的图像。不过我想按类型分类,例如蔬菜、肉类、生菜等。

我找不到这样做的方法。
最好和最简单的方法是什么?

我还想让用户使用选择器控制器选择他想要保存的类别来保存。 谢谢!我真的需要帮助!

更新 2
为了检查它是否被保存,我进一步构建了一个集合视图控制器,我在[arrayCollectionImages addObject:image]; 的图像部分收到错误消息,你能解释一下最后一段代码吗?我在 arrayCollectionImages 也有一个警告,说 arrayColectionImages 的本地声明隐藏了实例变量。 ——

@interface CollectionViewController (){
    NSArray *arrayCollectionImages;
}


@end

@implementation CollectionViewController

- (void)viewDidLoad {
        dispatch_queue_t searchQ = dispatch_queue_create("com.awesome", 0);
        dispatch_async(searchQ, ^{
            NSArray *arrayCollectionImages = [[NSArray alloc ]init];
            NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            NSString *documentsDirectory = [paths objectAtIndex:0];
            NSString *location=@"Hats";
            NSString *fPath = [documentsDirectory stringByAppendingPathComponent:location];
            NSArray *directoryContent = [[NSFileManager defaultManager] directoryContentsAtPath: fPath];
            for(NSString *str in directoryContent){
                NSString *finalFilePath = [fPath stringByAppendingPathComponent:str];
                NSData *data = [NSData dataWithContentsOfFile:finalFilePath];
                if(data)
                {   dispatch_async(dispatch_get_main_queue(),^{
                    UIImage *image = [UIImage imageWithData:data];
                });
                    [arrayCollectionImages addObject:images];
                }
            }
        });

    [super viewDidLoad];
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    CollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ReuseID" forIndexPath:indexPath];
    [[cell collectionImageView]setImage:[UIImage imageNamed:[arrayCollectionImages objectAtindex:indexPath.item]]];
    return cell;
}

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
    return [arrayCollectionImages count];
}
@end

【问题讨论】:

  • 图片保存在哪里?到文件?你是什​​么意思分类它?到目前为止你有什么代码?
  • 您可以将每张图片保存到应用沙箱中的单独文件夹中。这些图像不会在图库中可见,并且只能由您的应用访问。你想要这样吗?
  • 让我们在聊天中进行讨论
  • 1.由于你没有使用 UIImagePickerController ,你不需要包含 -(void)imagePickerController:(UIImagePickerController )picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ if(CFStringCompare((CFStringRef) mediaType, kUTTypeImage, 0) == kCFCompareEqualTo){ captureImage= (UIImage)[info objectForKey:UIImagePickerControllerOriginalImage]; } } 顺便说一下,在头文件中仅用于声明。我们不能把实现代码放在里面。 2. 您已经使用 AVCapture 捕获图像,并且 captureIamge 保存在 captureImage 变量中。查看我的编辑。
  • 这是使用 UICollectionView 获取图像的一大步,您也在使用 GCD。我会鼓励你慢慢来,因为我觉得你是 iOS 的初学者。简单的步骤是 NSLog directoryContent 数组。如果它包含任何内容,则说明您已成功保存图像,如果不包含,则必须继续学习。我觉得您为初学者选择了一个非常广泛的主题。我鼓励您阅读 Apple 文档或一本好书来开始学习。 Head First 的 iOS 开发书籍可能是一个开始。

标签: ios uiimageview save categories


【解决方案1】:

第 1 步:
设置选取器控制器。
这是official reference.
这是tutorial.

尝试使用您想要的所有类型值设置它。您将了解它的委托方法:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component

这将返回选择的流派。

第 2 步:
在每个图像上提供一个保存图标或一个保存按钮。单击该图标/按钮时,您应该显示您的选择器视图并让用户选择任何行,并且应该将图像复制到此处的私有变量或属性中,以便稍后在委托方法中引用它。

第 3 步: 当用户选择一行时,将调用此委托方法。在这里,我们将根据在 UIPickerView 中选择的类型创建一个新目录,如果不存在的话。然后你应该将你的图像写入路径。

   - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
            NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            NSString *documentsDirectory = [paths objectAtIndex:0];
            //fetch Category Name from the array used to fill the Picker View 
            NSString *categoryName= [array objectAtIndex:row];
            NSString *fPath = [documentsDirectory stringByAppendingPathComponent:categoryName];
            NSFileManager *fileManager=[[NSFileManager alloc]init];
            [fileManager createDirectoryAtPath:fPath withIntermediateDirectories:YES attributes:NO error:NO];

            UIImage *image= captureImage;
            NSData *data= UIImagePNGRepresentation(image);
            [data writeToFile:fPath atomically:NO];
}

从文档目录中的特定文件夹中检索图像:
首先创建该文件夹的路径。这将取决于特定的流派。假设类型 1。

 // An array to save all images. You have to do this in some other way if selected images are big in size.
 // For that case I suggest retrieving of images only when you are showing them on screen. 
  NSArray *allImagesArray = [[NSArray alloc ]init];
  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *documentsDirectory = [paths objectAtIndex:0];
  NSString *location=@"Genre1";
  NSString *fPath = [documentsDirectory stringByAppendingPathComponent:location]; 
  NSArray *directoryContent = [[NSFileManager defaultManager] directoryContentsAtPath: fPath];
  for(NSString *str in directoryContent){
   NSString *finalFilePath = [fPath stringByAppendingPathComponent:str]; 
    NSData *data = [NSData dataWithContentsOfFile:finalFilePath];
      if(data)
      {
        UIImage *image = [UIImage imageWithData:data];
        [allImagesArray addObject:image];
      }
  }

【讨论】:

  • 我们将步骤 2 的代码放在哪里是 View 加载的吗?如何使用选择器视图选择保存位置?我也没有真正得到第3步。我能够完成第 1 步
  • 查看我的编辑。在第 2 步中:您应该编写一个 saveAction 并显示您的 PickerView,并保存您的图像参考以供进一步使用。
  • 我更新了我的问题,你能看看吗?我差不多完成了..但还有一些问题。
  • 查看更新。如果你被困在某个地方,不要犹豫,问。快乐编码..:)
  • 抱歉多次评论。我能够清除警告,并且能够隐藏选择器视图,但我是否需要一个保存按钮,将图片带到用户选择的指示目录?我处于用户可以保存但我做不到的最后一点。用户现在可以选择他们想要保存到哪个类别,但我不能再进一步了。用户可以在哪里SAVE
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 2013-08-10
  • 2021-04-27
  • 2017-08-06
相关资源
最近更新 更多