iOS:将图像转换为PNG以允许保存

时间:2012-03-28 16:28:52

标签: objective-c ios uiimageview save

我正在处理的应用程序允许用户从相机胶卷中选择一张图像,并将其显示在UIImageView中。现在,我在尝试保存数据时遇到了一些问题。我知道我必须将图像转换为PNG并保存数据,但我遇到了一些问题。我很擅长保存文件和Objective-C。这是我正在使用的代码:

- (NSString *)dataFilePath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(
                                                         NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:kFilename9];
}

- (void)applicationDidEnterBackground:(NSNotification *)notification {
    NSMutableArray *array = [[NSMutableArray alloc] init];

    NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(image.image)];
    [array addObject:imageData];

    [array writeToFile:[self dataFilePath] atomically:YES];
}
- (void)viewDidLoad
{
    self.imgPicker = [[UIImagePickerController alloc] init];
    self.imgPicker.allowsImageEditing = YES;
    self.imgPicker.delegate = self;
    self.imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;


    NSString *filePath = [self dataFilePath];
    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
        NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
        image.image = [array objectAtIndex:0];
    }

    UIApplication *app = [UIApplication sharedApplication];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(applicationDidEnterBackground:)
                                                 name:UIApplicationDidEnterBackgroundNotification
                                               object:app];

    [super viewDidLoad];

}

程序崩溃时只需点击发生这种情况的选项卡。调试器声明“'NSInvalidArgumentException',原因:' - [__ NSCFData _isResizable]:无法识别的选择器发送到实例0x16cf50'”。非常感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:1)

好的,首先,你在第二次进入执行这些操作的“标签”时会收到此错误,是吗?所以错误应该在viewDidLoad方法中。其次,您的错误会调用选择器错误,因此请找到您使用@selector的位置。

以下是导致错误的问题:

[[NSNotificationCenter defaultCenter] addObserver:self
                                            selector:@selector(applicationDidEnterBackground:)
                                             name:UIApplicationDidEnterBackgroundNotification
                                           object:app];

请注意,applicationDidEnterBackground方法有一个参数(NSNotification *):

- (void)applicationDidEnterBackground:(NSNotification *)notification {

然而你正在发送它的应用程序,这是一个UIApplication:

UIApplication *app = [UIApplication sharedApplication]

这是我能看到的唯一能给你这个错误的东西。只需将其更改为此错误就应该消失:

- (void)applicationDidEnterBackground:(UIApplication*)application {

开始编辑:

至于保存图像,我不确切知道你是如何存储数据的,但这就是我要做的。

  1. 使用保留属性存储图像数据。
  2. <强> ViewController.h

    @interface ViewController
    
    //Add this line
    @property(retain) NSData* imageData;
    
    @end
    

    <强> ViewController.m

    //Remember to include this line somewhere in this file:
    @synthesize imageData;
    

    当您要保存文件时:

    - (void)applicationDidEnterBackground:(UIApplication*)application {
    self.imageData = [NSData dataWithData:UIImagePNGRepresentation(image.image)];
    
    [self.imageData writeToFile:[self dataFilePath] atomically:YES];
    

    }

    这样就不会丢失数据,也不需要使用数组。只需确保在viewDidUnload方法中添加此行:

    self.imageData = nil;
    

    结束编辑

    希望对你有所帮助。

答案 1 :(得分:0)

如果yourUIImage有效且包含数据,则可以调用

[imageData writeToFile:(NSString*) atomically(BOOL)]

无需创建数组并写入数据。