保存 UIImage 中显示的图像并对其进行分类

Posted

技术标签:

【中文标题】保存 UIImage 中显示的图像并对其进行分类【英文标题】:Save image that is displayed in UIImage and categorize it 【发布时间】: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 开发书籍可能是一个开始。 【参考方案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

以上是关于保存 UIImage 中显示的图像并对其进行分类的主要内容,如果未能解决你的问题,请参考以下文章

CheXpert 数据集仍然过拟合图像分类

从文件加载的 UIImage 部分是黑色的

以全尺寸保存 UIImage,包括从 UIImageView 进行的转换

NSData到UIImage

如何裁剪 UIScrollView 中显示的 UIImageView 部分并将其保存到 UIImage 变量?

将使用-v7.3(HDF5)保存的Matlab稀疏矩阵加载到Python中并对其进行操作