1. 程式人生 > >iOS呼叫相機和相簿 並編輯儲存到本地(個人中心設定頭像)

iOS呼叫相機和相簿 並編輯儲存到本地(個人中心設定頭像)

公司專案需求,需要設定使用者頭像,沒必要用到自定義相機,系統相機完全可以滿足需求,就寫了個小demo測試;



第一步:匯入協議

UINavigationControllerDelegate,UIImagePickerControllerDelegate

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UINavigationControllerDelegate,UIImagePickerControllerDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *imageScroll;
@property (weak, nonatomic) IBOutlet UIImageView *photoImage;

@end

第二步:開啟相機

#pragma mark - 從相機獲取圖片
- (IBAction)photoFromCamera:(id)sender {
    
    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
    {
        UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;//設定型別為相機
        UIImagePickerController *picker = [[UIImagePickerController alloc] init];//初始化
        picker.delegate = self;//設定代理
        picker.allowsEditing = YES;//設定照片可編輯
        picker.sourceType = sourceType;
        //設定是否顯示相機控制按鈕 預設為YES
        picker.showsCameraControls = YES;
        
//        //建立疊加層(例如新增的相框)
//        UIView *overLayView=[[UIView alloc]initWithFrame:CGRectMake(0, 120, 320, 254)];
//        //取景器的背景圖片,該圖片中間挖掉了一塊變成透明,用來顯示攝像頭獲取的圖片;
//        UIImage *overLayImag=[UIImage imageNamed:@"zhaoxiangdingwei.png"];
//        UIImageView *bgImageView=[[UIImageView alloc]initWithImage:overLayImag];
//        [overLayView addSubview:bgImageView];
//        picker.cameraOverlayView=overLayView;
        
        //選擇前置攝像頭或後置攝像頭
        picker.cameraDevice=UIImagePickerControllerCameraDeviceFront;
        [self presentViewController:picker animated:YES completion:^{
        }];
    }
    else {
        NSLog(@"該裝置無相機");
    }

}

第三步:呼叫相簿

#pragma mark - 從相簿獲取圖片
- (IBAction)photoFromAlbum:(id)sender {
    //首先需要判斷資源是否可用
    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
    
    UIImagePickerController *pickerImage = [[UIImagePickerController alloc] init];
    
        pickerImage.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        //獲得相機模式下支援的媒體型別
//        pickerImage.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:pickerImage.sourceType];
        pickerImage.delegate = self;
        //設定允許編輯
        pickerImage.allowsEditing = YES;
        
        [self presentViewController:pickerImage animated:YES completion:^{
        }];
    }
}
第四步:從相簿選擇圖片後操作
#pragma mark - 從相簿選擇圖片後操作
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    //NSLog(@"%@",info);

    //獲取源影象(未經裁剪)
//    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
    
    //獲取裁剪後的影象
    UIImage *image = info[UIImagePickerControllerEditedImage];
    
    //將照片存到媒體庫
     UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
    
    self.photoImage.image = image;
    
    //將照片存到沙盒
    [self saveImage:image];
    
    [picker dismissViewControllerAnimated:YES completion:^{
    }];
}

第五步:照片存到本地後的回撥
#pragma mark - 照片存到本地後的回撥
- (void)image:(UIImage*)image didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo{
    if (!error) {
        NSLog(@"儲存成功");
    } else {
        NSLog(@"儲存失敗:%@", error);
    }
}

第六步:儲存圖片
#pragma mark - 儲存圖片
- (void) saveImage:(UIImage *)currentImage {
    //設定照片的品質
    NSData *imageData = UIImageJPEGRepresentation(currentImage, 0.5);
    
    NSLog(@"%@",NSHomeDirectory());
    // 獲取沙盒目錄
    NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/currentImage.png"];
    // 將圖片寫入檔案
    [imageData writeToFile:filePath atomically:NO];
    //將選擇的圖片顯示出來
//    [self.photoImage setImage:[UIImage imageWithContentsOfFile:filePath]];
    
}

第七步:取消操作呼叫
#pragma mark - 取消操作時呼叫
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [picker dismissViewControllerAnimated:YES completion:^{
    }];
}


群裡有一個夥計呼叫系統相簿、相機發現是英文的系統相簿介面後標

題顯示“photos”,但是手機語言已經設定顯示中文,糾結半天,最終在info.plist設定解

決問題,我反正閒著也是沒事於是就搜尋了下相關的資料


發現在專案的info.plist裡面新增Localized resources can be mixed 為 YES(表示是否允

許應用程式獲取框架庫內語言)即可解決這個問題。