保存到目录不起作用

Posted

技术标签:

【中文标题】保存到目录不起作用【英文标题】:Saving to directory does not work 【发布时间】:2013-08-16 13:32:02 【问题描述】:

我正在尝试将图像保存到我这样创建的目录之一。

- (void) processImage:(UIImage *)image  //process captured image, crop, resize and rotate
    haveImage = YES;

    if([UIDevice currentDevice].userInterfaceIdiom==UIUserInterfaceIdiomPad)  //Device is ipad
        // Resize image
        UIGraphicsBeginImageContext(CGSizeMake(768, 1022));
        [image drawInRect: CGRectMake(0, 0, 768, 1022)];
        UIImage *smallImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        CGRect cropRect = CGRectMake(0, 130, 768, 768);
        CGImageRef imageRef = CGImageCreateWithImageInRect([smallImage CGImage], cropRect);
        //or use the UIImage wherever you like

        [captureImage setImage:[UIImage imageWithCGImage:imageRef]];

        CGImageRelease(imageRef);

    else //Device is iphone
        // Resize image
        UIGraphicsBeginImageContext(CGSizeMake(320, 426));
        [image drawInRect: CGRectMake(0, 0, 320, 426)];
        UIImage *smallImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        CGRect cropRect = CGRectMake(0, 55, 320, 320);
        CGImageRef imageRef = CGImageCreateWithImageInRect([smallImage CGImage], cropRect);

        [captureImage setImage:[UIImage imageWithCGImage:imageRef]];

        CGImageRelease(imageRef);
    

    //adjust image orientation based on device orientation
    if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft) 
        NSLog(@"landscape left image");

        [UIView beginAnimations:@"rotate" context:nil];
        [UIView setAnimationDuration:0.5];
        captureImage.transform = CGAffineTransformMakeRotation(DegreesToRadians(-90));
        [UIView commitAnimations];

    
    if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight) 
        NSLog(@"landscape right");

        [UIView beginAnimations:@"rotate" context:nil];
        [UIView setAnimationDuration:0.5];
        captureImage.transform = CGAffineTransformMakeRotation(DegreesToRadians(90));
        [UIView commitAnimations];

    
    if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown) 
        NSLog(@"upside down");
        [UIView beginAnimations:@"rotate" context:nil];
        [UIView setAnimationDuration:0.5];
        captureImage.transform = CGAffineTransformMakeRotation(DegreesToRadians(180));
        [UIView commitAnimations];

    
    if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait) 
        NSLog(@"upside upright");
        [UIView beginAnimations:@"rotate" context:nil];
        [UIView setAnimationDuration:0.5];
        captureImage.transform = CGAffineTransformMakeRotation(DegreesToRadians(0));
        [UIView commitAnimations];

        NSArray *directoryNames = [NSArray arrayWithObjects:@"hats",@"bottoms",@"right",@"left",nil];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder

        for (int i = 0; i < [directoryNames count] ; i++) 
            NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:[directoryNames objectAtIndex:i]];
            if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
                [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:nil]; //Create folder

        NSString *folderPath = [documentsDirectory stringByAppendingPathComponent:@"hats"]; 
        NSString *filePath = [filePath stringByAppendingPathComponent:@"IMAGE_NAME_HERE.PNG"]; 
        NSData *imageData = UIImagePNGRepresentation(captureImage.image);
        [imageData writeToFile:filePath atomically:YES];  

但是它不起作用,因为我创建了一个集合视图,以便我可以看到保存的内容。如果要求,我会显示它的代码。此外,我在代码末尾收到警告说未使用的变量文件夹路径和变量文件路径在其自己的初始化中使用时未初始化。我的最终目标是用户在目录帽中拍照。它显示在从目录帽子获取照片的集合视图中。我的代码有什么缺陷吗?

【问题讨论】:

【参考方案1】:

你正在这样做:

NSString *folderPath = [documentsDirectory stringByAppendingPathComponent:@"hats"]; 
NSString *filePath = [filePath stringByAppendingPathComponent:@"IMAGE_NAME_HERE.PNG"]; 

当我认为你打算这样做时:

NSString *folderPath = [documentsDirectory stringByAppendingPathComponent:@"hats"]; 
NSString *filePath = [folderPath stringByAppendingPathComponent:@"IMAGE_NAME_HERE.PNG"];

基本上,您对folderPath 有一个未使用的变量警告,因为您错误地写了NSString *filePath = [filePath ...,它完全忽略了文件夹路径,创建了一个空白字符串,然后将您的文件名附加到它上面。如果你记录了这个字符串,你会看到它只输出你的文件名,没有附加到文件目录的路径。

【讨论】:

感谢警告已消失。如果您不使用模拟器,如何检查保存是否有效?而且我是否必须编写更多代码来说明我要保存的照片在 UIImage 中?我无法使用模拟器,因为一旦拍摄图像,它就会显示在 UIImage 中。 @Shouri 好吧,在这里查看最佳答案:***.com/a/8376586/716216 它描述了如何列出文档目录中的所有文件,您可以使用它来确定文件是否已保存。不,不完全是。您实际上并没有保存 UIImage 而是图像的 png 表示。当需要读取图像时,您只需使用[UIImage imageWithContentsOfFile:。如果这个答案已经解决了你原来的问题,请记得标记为正确:) 你能解释一下最后一个代码[UIImage imageWithContentsOfFile:这是否意味着我的代码都设置为保存?还是我需要输入代码 [UIImage imageWithContentsOfFile: ?使用大约 4 个代码保存显示在 UIImage 中的图片是否如此简单?很抱歉有很多问题 @Shouri 很难说你的代码是否有效,但不,你不需要添加[UIImage imageWithContentsOfFile: yet。仅当您想从文档目录中读取图像时才需要此代码。

以上是关于保存到目录不起作用的主要内容,如果未能解决你的问题,请参考以下文章

初始目录不起作用

将 skspritenode 位置保存到 plist 不起作用

Android:将arrayList保存到文件不起作用

将 NSImage 保存到路径不起作用

核心数据保存到数据库不起作用

将字典保存到 iPhone 不起作用?