保存 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 中显示的图像并对其进行分类的主要内容,如果未能解决你的问题,请参考以下文章
以全尺寸保存 UIImage,包括从 UIImageView 进行的转换