将 UIImage 转换为 NSData 并与核心数据一起保存
Posted
技术标签:
【中文标题】将 UIImage 转换为 NSData 并与核心数据一起保存【英文标题】:Convert UIImage to NSData and save with core data 【发布时间】:2013-01-03 05:08:39 【问题描述】:我有一个UIImageView
,其图像是通过UIImagePicker
设置的
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
[picker dismissViewControllerAnimated:YES completion:nil];
self.gImage.image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
我“尝试”将此图像转换为NSData
并将其与核心数据一起保存:
NSData *imageData = UIImagePNGRepresentation(self.gImage.image);
NSString *savedData = [[NSString alloc]initWithData:imageData encoding:NSUTF8StringEncoding];
//am is a pointer to my entities class. imageData is just a NSString attribute
am.imageData = savedData;
NSError *error;
if (![self.managedObjectContext save:&error])
//Handle Error
else
[self dismissViewControllerAnimated:YES completion:nil];
然后我尝试将图像加载到单独的文件中:
self.cell.gImage.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:self.myEntity.imageData]]];
我不明白为什么这不起作用。非常感谢任何帮助!
【问题讨论】:
您有机会查看我的答案吗? @SibaPrasadHota 是的,我正在浏览每个答案,看看哪一个适合我,非常感谢您的帮助! 【参考方案1】:您可以像这样将 UIImage 转换为 NSData:
如果是 PNG 图片
UIImage *image = [UIImage imageNamed:@"imageName.png"];
NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(image)];
如果是JPG图片
UIImage *image = [UIImage imageNamed:@"imageName.jpg"];
NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
您可以像这样将它存储在 CoreData 中(这是一种可能有用的解决方案):
[newManagedObject setValue:imageData forKey:@"image"];
您可以像这样从 CoreData 加载数据:
NSManagedObject *selectedObject = [[self yourFetchCOntroller] objectAtIndexPath:indexPath];
UIImage *image = [UIImage imageWithData:[selectedObject valueForKey:@"image"]];
// Set the image to your image view
yourimageView.image = image;
【讨论】:
如何知道它是 jpg 还是 png 图像?我允许用户从photoLibrary
中选择一张图片,或者将其与camera
一起使用,谢谢!
大量捕获的相机图像是 png 我只是将用于将图像转换为 NSData 我的 frnd 的两个代码.. :)
好的,非常感谢:D 你介意发布几行关于如何从核心数据中获取 nsdata 并将其加载到 UIImageView 中的内容吗?非常感谢!
嘿伙计,感谢您的帮助,但有一个警告......我没有使用NSFetchedResultsController
,所以我可以用什么代替[self yourFetchCOntroller]
?再次感谢!
如何在 NSData..中转换 gif 图片?【参考方案2】:
为了快速,它只是:
UIImage
到 NSData
imageData = UIImagePNGRepresentation(image)
【讨论】:
【参考方案3】:用于存储在数据库中:::
NSInteger RandomIndex = arc4random() % 1000;
NSString *randomImageName =[NSString stringWithFormat:@"Image%i.png",RandomIndex];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:randomImageName];
if ([[NSFileManager defaultManager] fileExistsAtPath:savedImagePath])
[[NSFileManager defaultManager] removeItemAtPath:savedImagePath error:nil];
NSLog(@"file removed from path");
NSLog(@"Saved Image Path : %@",savedImagePath);
NSData* imageData = UIImagePNGRepresentation (image1 );
[imageData writeToFile:savedImagePath atomically:YES];
//am is a pointer to my entities class. imageData is just a NSString attribute
am.imageData = randomImageName;
当您从数据库中获取该图像时,您可以编写以下代码...
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:randomImageName];
NSData *myData = [NSData dataWithContentsOfFile:savedImagePath];
UIImage *selectedImage = [UIImage imageWithData:myData];
我觉得对你有帮助。
【讨论】:
非常感谢,我今天早些时候正在研究这种方法。不幸的是我没有成功。感谢您的回复,在第一块代码的最后一行,am.imageData = @"imageName";
我可以用什么替换imageName
?因为用户将要从库中选择图像/用相机拍照。再次感谢!
我只是为了理解而写的。您可以编写随机名称并保存在数据库中。这只是为了我们的理解目的。但这种方法更好。 NSInteger RandomIndex = arc4random() % 1000; NSString *imageName =[NSString stringWithFormat:@"Image%i.png",RandomIndex];
太棒了! :D 好的,所以你的代码工作得很好,除非我在表格视图中设置另一个图像,所有图像都会更改为新选择的图片。我认为这与 :NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:@"imageName"];
我应该在 @"imageName" 中输入什么有关?非常感谢!
哥们,这玩意现在让我很生气,它甚至没有重新设置图片!【参考方案4】:
在 Mac OS 上,您可以让 Core Data 为您处理这个问题,方法是勾选模型中属性上的 Transformable 框,而不是选择特定的转换器,并将 UIImage 直接分配给属性。
我不确定它是否适用于 ios,但可能值得一试。
【讨论】:
实际上,它确实可以在 iOS 上运行,但问题是由于某种原因它在设备上非常非常缓慢和困难。不知道是不是我的图片太大了,谢谢!【参考方案5】:要将图像转换为 NSData,请尝试以下代码...
UIImage *image = [UIImage imageNamed:@"imageName.png"];
NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(image)];
让我知道它是否有效..!!!
编码愉快!!!!
【讨论】:
感谢您的帮助,但是,我的代码中已经有了这个。我只是不确定为什么它不起作用! :( self.cell.gImage.image = [[UIImage alloc] initWithData:imageData];,试试这个我的朋友,我认为这段代码不会让你的 imageview 空白......快乐编码! !!! 天哪,我不知道发生了什么,这仍然无法正常工作!图像视图仍然是空白的! 试试 NSLOG NSData,不管它是否生成 NSData..告诉我【参考方案6】:试试这个代码来保存图像数据
保存:
NSManagedObjectContext *context = [self managedObjectContext];
newsObj = [NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:context];
NSData *imageData = UIImagePNGRepresentation(self.gImage.image);
[newsObj setValue:imageData forKey:@"imgPng"];
NSError *error;
@try
if (managedObjectContext != nil)
if (![managedObjectContext save:&error])
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
@catch (NSException *exception)
NSLog(@"inside exception");
要检索试试这个:
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity1 = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:context];
[fetchRequest setEntity:entity1];
NSError *error;
NSArray * array = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (array == nil)
NSLog(@"Testing: No results found");
else
NSLog(@"Testing: %d Results found.", [array count]);
NSData * dataBytes = [[array objectAtIndex:0] imgPng];;
image = [UIImage imageWithData:dataBytes];
[fetchRequest release];
@catch (NSException *exception)
NSLog(@"inside exception");
【讨论】:
【参考方案7】:此代码将您的图像数据保存到文件数据中,您可以在任何地方使用它
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image1 editingInfo:(NSDictionary *)editingInfo
CGSize destinationSize = CGSizeMake(170,170);
UIGraphicsBeginImageContext(destinationSize);
[image1 drawInRect:CGRectMake(0,0,destinationSize.width,destinationSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NsData *filedata = UIImagePNGRepresentation(newImage);
[picker dismissModalViewControllerAnimated:YES];
【讨论】:
【参考方案8】:这是我所做的以及它用于存储到 nsdata 的工作。
[productTypeSub setValue:[[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]] forKey:@"imgSmall"];
并使用此代码加载到图像
ImgProductType.image= [[UIImage alloc] initWithData:productTypeSub.imgSmall];
【讨论】:
以上是关于将 UIImage 转换为 NSData 并与核心数据一起保存的主要内容,如果未能解决你的问题,请参考以下文章
将UIImage转换为NSData并在Swift中转换回UIImage?