iOS擷取相簿/相機圖片-------自訂擷取圖片小控制項

來源:互聯網
上載者:User

標籤:

一、功能簡介

1、封裝了一個按鈕,點擊按鈕,會提示從何處擷取圖片:如果裝置支援相機,可以從相機擷取,同時還可以從手機相簿擷取圖片。

2、選擇圖片後,有一個block回調,根據需求,將獲得的圖片拿來使用。

3、提供了初始化方法,可以靈活定義按鈕,包括把返回的圖片設定給按鈕自己。

 

二、核心原理

1、UIAlertController 提示框

2、UIImagePickerController 圖片拾取控制器

3、isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera 類方法,判斷是否支援相機

4、遵守UIImagePickerControllerDelegate,UINavigationControllerDelegate

5、實現代理方法獲得圖片:- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

6、UIImageJPEGRepresentation 方法將圖片壓縮轉換層NSData,然後寫入沙箱

 

三、源碼

 

1、.h檔案

 

@interface ZQImageToolsButton : UIButton/** *  可以獲得儲存圖片資訊的字典,裡麵包含了沙箱裡的圖片完整路徑(程式每次運行沙箱的路徑可能會不同,但是圖片名不變) * *  @return */-(NSDictionary * )getImageInfro;/** *  初始化方法,點擊按鈕可以選擇從相簿或是相機(如果有相機)選擇圖片並返回圖片 * *  @param title      按鈕的名字 *  @param frame      按鈕的frame *  @param controller 按鈕所在的控制器,彈出對話方塊的控制器 *  @param block      獲得圖片後的回調 *  @param imageName  儲存在沙箱裡圖片的名字 * *  @return 返回一個按鈕 */-(instancetype)initWithTitle:(NSString *)title frame:(CGRect)frame controller:(UIViewController *)controller imageBlock:(void(^)(UIImage *))block imageName :(NSString *)imageName;@end

 

2、.m檔案

 

@interface ZQImageToolsButton() <UIImagePickerControllerDelegate,UINavigationControllerDelegate>@property(nonatomic,weak) UIViewController * controller;@property(nonatomic,copy) void(^imageBlock)(UIImage *) ;@property(nonatomic,strong) NSString * imageName;@property(nonatomic,strong) NSDictionary * imageInfro;@end@implementation ZQImageToolsButton-(NSDictionary * )getImageInfro{    return self.imageInfro;}-(instancetype)initWithTitle:(NSString *)title frame:(CGRect)frame controller:(UIViewController *)controller imageBlock:(void(^)(UIImage *))block imageName :(NSString *)imageName{    self = [[ZQImageToolsButton alloc]initWithFrame:frame];        self.imageBlock = block;        self.controller = controller;        self.imageName = imageName;        [self setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];        [self setTitle:title forState:UIControlStateNormal];        [self addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];        return self ;}- (void)btnClick:(UIButton *) btn{        // 建立圖片管理器、 跳轉到相機或相簿頁面    UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];        imagePickerController.delegate = self;        imagePickerController.allowsEditing = YES;            //建立彈框        UIAlertController * av = [UIAlertController alertControllerWithTitle:@"選擇" message:@"從您的相簿/相機選擇" preferredStyle:UIAlertControllerStyleActionSheet];            //設定image管理器的源類型        __block NSInteger sourceType = 0;        UIAlertAction * photo = [UIAlertAction actionWithTitle:@"我的相簿" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {                        //圖片源為相簿                sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;                imagePickerController.sourceType = sourceType;                [self.controller presentViewController:imagePickerController animated:YES completion:^{}];            }];            UIAlertAction * camera = [UIAlertAction actionWithTitle:@"我的相機" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {                        //圖片源為相機                sourceType = UIImagePickerControllerSourceTypeCamera;                imagePickerController.sourceType = sourceType;                [self.controller presentViewController:imagePickerController animated:YES completion:^{}];                    }];        UIAlertAction * cancle = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {        //取消    }];                //判斷是否支援相機        if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])    {        [av addAction:photo];        [av addAction:camera];        [av addAction:cancle];            }    else    {        //如果不支援相機,就不用把相機按鈕加入提示框了        [av addAction:photo];        [av addAction:cancle];    }      [self.controller presentViewController:av animated:YES completion:nil];    }// 圖片選擇結束之後,走這個方法,字典存放所有圖片資訊#pragma mark - image picker delegte 系統代理程式,返回從相簿中選中的圖片- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{    [picker dismissViewControllerAnimated:YES completion:^{            NSLog(@"選好圖片了");        }];        //獲得選中的圖片了!    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];        //block回調,獲得圖片後,交給控制器    self.imageBlock(image);        // 儲存圖片至本地,用傳進來的名字重新拼接圖片名字        NSString * imgName = [NSString stringWithFormat:@"SavedImage-%@.png",self.imageName];        //拼接儲存至沙箱的路徑    NSString *fullPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:imgName];        //記錄一片的資訊,存到字典中,需要的時候可以訪問    NSDictionary *dic = @{@"image":fullPath};    self.imageInfro = dic;        //儲存到沙箱        [self saveImage:image withName:imgName filePath:fullPath];    }//儲存至沙箱- (void) saveImage:(UIImage *)currentImage withName:(NSString *)imageName filePath:(NSString *)filePath{    //壓縮比例0.5    NSData * imageData = UIImageJPEGRepresentation(currentImage, 0.5);    // 將圖片寫入檔案    [imageData writeToFile:filePath atomically:NO];}@end

 

四、擴充

1、本例沒有實現圖片的多選 

2、本例沒有實現上傳圖片的商務邏輯

3、小東西,供娛樂交流使用

iOS擷取相簿/相機圖片-------自訂擷取圖片小控制項

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.