将UIImage转换为NSData并使用Core Data进行保存

18

我有一个UIImageView,它的图片是通过UIImagePicker设置的

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    [picker dismissViewControllerAnimated:YES completion:nil];
    self.gImage.image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
}

我“尝试”将这个图像转换为NSData并与Core Data一起保存:

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]]];

我不明白为什么这不起作用。任何帮助都将不胜感激!


你有没有机会检查我的答案? - Siba Prasad Hota
@SibaPrasadHota 是的,我正在查看每个答案以确定哪一个适合我,非常感谢您的帮助! - Bad_APPZ
8个回答

58

您可以按如下方式将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;

1
如何知道一个图片是jpg还是png格式?我允许用户从“照片库”中选择图片或使用“相机”拍摄,谢谢! - Bad_APPZ
1
主要捕获的相机图像是PNG格式,我只是将转换图像为NSData的代码放在一起,我的朋友.. :) - Nitin Gohel
好的,非常感谢:D 你介意贴出一些如何从Core Data获取NSData并将其加载到UIImageView的代码吗?非常感谢! - Bad_APPZ
嘿,伙计,感谢你的帮助,但是有一个限制...我没有使用NSFetchedResultsController,那么我可以用什么代替[self yourFetchCOntroller]呢?再次感谢! - Bad_APPZ
如何将 GIF 图像转换为 NSData..? - Surjeet Rajput

10

对于Swift来说只需要:

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?因为用户将从库中选择图像/使用相机拍摄照片。再次感谢! - Bad_APPZ
1
我只是为了理解而写的。您可以随意编写名称并保存在数据库中。这仅供我们理解目的。但是这种方法更好。NSInteger RandomIndex = arc4random()%1000; NSString *imageName =[NSString stringWithFormat:@"Image%i.png",RandomIndex]; - Prasad G
太棒了!! :D 好的,你的代码很好用,除了当我在表视图中设置另一张图片时,所有的图片都会改变成新选择的图片。我认为这与这行代码有关:NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:@"imageName"]; 我应该在@"imageName"中放什么?非常感谢! - Bad_APPZ
这个东西真让我恼火,它甚至不能再次设置图片! - Bad_APPZ

2
在 Mac OS 上,您可以通过在模型中的属性上勾选“可转换”框并直接将 UIImage 分配给该属性来让 Core Data 为您处理此问题,而不选择特定的转换器。 我不确定它是否适用于 iOS,但值得一试。

实际上,它在iOS上可以运行,但问题是由于某种原因它非常非常慢且对设备造成了很大的负担。不确定我的图片是否太大,谢谢! - Bad_APPZ

1
把图像转换成NSData,可以尝试以下的代码...
UIImage *image = [UIImage imageNamed:@"imageName.png"];
NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(image)];

请告诉我它是否正常工作..!!!

编程愉快!!!!


谢谢你的帮助,但是我已经在我的代码中加入了这个。我只是不确定为什么它不起作用!:( - Bad_APPZ
self.cell.gImage.image = [[UIImage alloc] initWithData:imageData];,试试这个代码吧,我的朋友,我认为这个代码不会让你的图像视图保持空白...编码愉快!!!! - NiravPatel
天哪,我不知道发生了什么事,这仍然不起作用!ImageView 仍然是空白的! - Bad_APPZ
只需尝试NSLOG NSData,无论它是否生成NSData,告诉我即可。 - NiravPatel

1

尝试使用以下代码保存图像数据

保存:

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");
}

0

这段代码将您的图像数据保存到文件数据中,您可以在任何地方使用它

-(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];
   }
}

0

这是我所做的,它可以成功地将数据存储到NSData中。

[productTypeSub setValue:[[NSData alloc] initWithContentsOfURL:[NSURL  URLWithString:url]] forKey:@"imgSmall"];

使用此代码加载图像

ImgProductType.image= [[UIImage alloc] initWithData:productTypeSub.imgSmall];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接