117

ユーザーが画像を保存できるようになるまで配置して保持できる 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 に配置し、ユーザーがそのビューをスタックにプッシュしたときに表示できるようにしたいと考えています。どんな助けでも大歓迎です!

4

6 に答える 6

344

それはすべて良いです、男。自分や他人を傷つけないでください。

データセットが大きくなりすぎるとパフォーマンスに影響を与える可能性があるため、これらのイメージをCoreDataに保存することはおそらく望ましくありません。画像をファイルに書き込む方がよいでしょう。

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

お役に立てば幸いです。

于 2011-07-25T20:41:26.237 に答える
3

拡張機能付きの Swift 4

extension UIImage{

func saveImage(inDir:FileManager.SearchPathDirectory,name:String){
    guard let documentDirectoryPath = FileManager.default.urls(for: inDir, in: .userDomainMask).first else {
        return
    }
    let img = UIImage(named: "\(name).jpg")!

    // Change extension if you want to save as PNG.
    let imgPath = URL(fileURLWithPath: documentDirectoryPath.appendingPathComponent("\(name).jpg").absoluteString)
    do {
        try UIImageJPEGRepresentation(img, 0.5)?.write(to: imgPath, options: .atomic)
    } catch {
        print(error.localizedDescription)
    }
  }
}

使用例

 image.saveImage(inDir: .documentDirectory, name: "pic")
于 2018-06-19T07:26:17.347 に答える
0

スウィフトの場合:

let paths: [NSString?] = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .LocalDomainMask, true)
if let path = paths[0]?.stringByAppendingPathComponent(imageName) {
    do {
        try UIImagePNGRepresentation(image)?.writeToFile(path, options: .DataWritingAtomic)
    } catch {
        return
    }
}
于 2016-08-21T09:26:36.183 に答える