1. ホーム
  2. objective-c

[解決済み] IOSのUIViewからアプリケーションのドキュメントフォルダに画像を保存する

2022-05-13 12:53:11

質問

UIImageViewを持っていて、ユーザーが画像を保存できるまで、画像を配置し、保持することができます。問題は、私がビューに配置した画像を実際に保存して取得する方法を見つけ出すことができないことです。

私はこのようにUIImageViewに画像を取得し、配置しました。

//Get Image 
- (void) getPicture:(id)sender {
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.allowsEditing = YES;
    picker.sourceType = (sender == myPic) ? UIImagePickerControllerSourceTypeCamera : UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    [self presentModalViewController:picker animated:YES];
    [picker release];
}


- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage (UIImage *)image editingInfo:(NSDictionary *)editingInfo {
    myPic.image = image;
    [picker dismissModalViewControllerAnimated:YES];
}

UIImageViewに選択した画像がうまく表示されるのですが、それを保存する方法がわかりません。ビューの他のすべての部分(主にUITextfield)をCore Dataに保存しています。検索して、検索して、人々が提案するコードの多くの部分を試しましたが、私がコードを正しく入力していないか、それらの提案が私のコードのセットアップ方法で動作しないかのどちらかです。おそらく前者だと思います。UITextFieldsのテキストを保存するときに使っているのと同じアクション(保存ボタン)を使って、UIImageViewに画像を保存したいと思っています。以下は、UITextFieldの情報を保存する方法です。

// Handle Save Button
- (void)save {

    // Get Info From UI
    [self.referringObject setValue:self.myInfo.text forKey:@"myInfo"];

先ほども言ったように、いくつかの方法を試してみたのですが、なかなかうまくいきません。生まれて初めて無生物に物理的な危害を加えたいと思いましたが、なんとか自制しています。

ユーザーが配置した画像をアプリケーションのドキュメント フォルダ内の UIImageView に保存し、ユーザーがそのビューをスタックにプッシュしたときに、それを取得して別の UIImageView に配置して表示できるようにしたいのですが、どうすればよいでしょうか。どんな助けでも大いに感謝します。

どのように解決するのですか?

大丈夫だよ。自分も他人も傷つけないように。

データセットが大きくなりすぎるとパフォーマンスに影響が出るので、おそらくこれらの画像をCore Dataに保存することはしないでしょう。画像をファイルに書き出す方が良いでしょう。

NSData *pngData = UIImagePNGRepresentation(image);

これは、取り込んだ画像のPNGデータを取り出します。ここから、ファイルに書き出すことができます。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
NSString *documentsPath = [paths objectAtIndex:0]; //Get the docs directory 
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"image.png"]; //Add the file name
[pngData writeToFile:filePath atomically:YES]; //Write the file

後で読む場合も同じように動作します。上でやったようにパスを構築して、それから

NSData *pngData = [NSData dataWithContentsOfFile:filePath];
UIImage *image = [UIImage imageWithData:pngData];

おそらくやりたいことは、パス文字列を作成するメソッドを作ることでしょう。なぜなら、そのコードがあちこちに散らばっていると困るからです。それは次のようなものです。

- (NSString *)documentsPathForFileName:(NSString *)name
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);  
    NSString *documentsPath = [paths objectAtIndex:0];

    return [documentsPath stringByAppendingPathComponent:name]; 
}

参考になれば幸いです。