OC調(diào)用相機(jī)并且給拍好的照片添加水印

OC調(diào)用相機(jī)并且給拍好的照片添加水印

今天我們學(xué)習(xí)一下iOS調(diào)用原生相機(jī)并且給照片添加水印要怎么做捶索。

首先我們新建一個項目,在開始寫代碼之前我們要添加權(quán)限灰瞻。找到項目的Info.plist文件腥例,添加相機(jī)和相冊的使用權(quán)限。右鍵>Add Row 添加 "Privacy - Photo Library Usage Description" 和 "Privacy - Camera Usage Description"的key酝润。value填寫自定義提示文字院崇。(當(dāng)用戶第一次要使用相機(jī)和相冊的時候會彈出提示框)


1-1

Privacy - Photo Library Usage Description
Privacy - Camera Usage Description

話不多說直接貼代碼。

先導(dǎo)入頭文件

#import <Photos/Photos.h>
@interface ViewController ()<UIImagePickerControllerDelegate>
@property (strong,nonatomic)  UIImagePickerController * pickerImage;

UIImagePickerController的初始化

self.pickerImage =[[UIImagePickerController alloc] init];
    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
        UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;//設(shè)置類型為相機(jī)
        self.pickerImage.delegate = self;//設(shè)置代理
        self.pickerImage.allowsEditing = YES;//設(shè)置照片可編輯
        self.pickerImage.sourceType = sourceType;
        //設(shè)置是否顯示相機(jī)控制按鈕 默認(rèn)為YES
        self.pickerImage.showsCameraControls = YES;

        //創(chuàng)建疊加層(例如添加的相框,這里通過這種方式可以在拍照的時候把水印直接顯示在相機(jī)上) 
        UIView *overLayView=[[UIView alloc]initWithFrame:CGRectMake(0, 60, s_width, s_height - 200)];
        UILabel * telLbl = [[UILabel alloc]initWithFrame:CGRectMake(40, s_height - 300 - 200, 300, 30)];
        telLbl.textColor = UIColor.whiteColor;
        telLbl.text = [NSString stringWithFormat:@"手機(jī)號:%@",self.shouji.text];
        [overLayView addSubview:telLbl];
        UILabel * jingduLbl = [[UILabel alloc]initWithFrame:CGRectMake(40, s_height - 268 - 200, 300, 30)];
        jingduLbl.text =  [NSString stringWithFormat:@"經(jīng)度:%@",jingdu] ;
        jingduLbl.textColor = UIColor.whiteColor;
        [overLayView addSubview:jingduLbl];
        UILabel * weiduLbl = [[UILabel alloc]initWithFrame:CGRectMake(40, s_height - 236 - 200, 300, 30)];
        weiduLbl.text = [NSString stringWithFormat:@"緯度:%@",weidu];
        weiduLbl.textColor = UIColor.whiteColor;
        [overLayView addSubview:weiduLbl];
        UILabel * dizhiLbl = [[UILabel alloc]initWithFrame:CGRectMake(40, s_height - 202 - 200, 400, 30)];
        dizhiLbl.text = [NSString stringWithFormat:@"地址:%@",dizhi];
        dizhiLbl.textColor = UIColor.whiteColor;
        [overLayView addSubview:dizhiLbl];
        UILabel * shijianLbl = [[UILabel alloc]initWithFrame:CGRectMake(40, s_height - 170 - 200, 300, 30)];
        shijianLbl.text = [NSString stringWithFormat:@"時間:%@",currentDateStr];
        shijianLbl.textColor = UIColor.whiteColor;
        [overLayView addSubview:shijianLbl];
        UILabel * beizhuLbl = [[UILabel alloc]initWithFrame:CGRectMake(40, s_height - 138 - 200, 300, 30)];
        beizhuLbl.text = [NSString stringWithFormat:@"備注:%@",self.beizhu.text];;
        beizhuLbl.textColor = UIColor.whiteColor;
        [overLayView addSubview:beizhuLbl];

        //選擇前置攝像頭或后置攝像頭
        self.pickerImage.cameraDevice=UIImagePickerControllerCameraDeviceRear;
        //調(diào)用系統(tǒng)攝像頭
        [self presentViewController:self.pickerImage animated:YES completion:^{
        }];
        }

拍照以后通過代理方法獲取當(dāng)前得到的圖片

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    
    // 獲取用戶拍攝的是照片還是視頻
   UIImage *theImage =nil;
        // 判斷袍祖,圖片是否允許修改
   if ([picker allowsEditing])
   {
       // 獲取用戶編輯之后的圖像
       theImage = [info objectForKey:UIImagePickerControllerEditedImage];
   }
   else
   {
       // 獲取原始的照片
       theImage = [info objectForKey:UIImagePickerControllerOriginalImage];
   }
    [self composeImg:theImage];
}

水印簡單來說就是兩張圖片何在一起,我們現(xiàn)在現(xiàn)在來通過UIView畫一張圖片谢揪,把它當(dāng)做簡單的水印蕉陋,當(dāng)然大家自己有水印素材可以直接跳過這一步,用兩個UIImage對象去合成一張圖片

- (void)initLogoImage
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    //設(shè)定時間格式,這里可以設(shè)置成自己需要的格式
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    //用[NSDate date]可以獲取系統(tǒng)當(dāng)前時間
    NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate date]];
    //創(chuàng)建疊加層(例如添加的相框)
    UIView *overLayView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, s_width, s_height - 200)];
    UILabel * telLbl = [[UILabel alloc]initWithFrame:CGRectMake(40, s_height - 300 - 200, 300, 30)];
    telLbl.textColor = UIColor.whiteColor;
    telLbl.text = [NSString stringWithFormat:@"手機(jī):%@",self.shouji.text];
    [overLayView addSubview:telLbl];
    UILabel * jingduLbl = [[UILabel alloc]initWithFrame:CGRectMake(40, s_height - 268 - 200, 300, 30)];
    jingduLbl.text =  [NSString stringWithFormat:@"經(jīng)度:%@",jingdu] ;
    jingduLbl.textColor = UIColor.whiteColor;
    [overLayView addSubview:jingduLbl];
    UILabel * weiduLbl = [[UILabel alloc]initWithFrame:CGRectMake(40, s_height - 236 - 200, 300, 30)];
    weiduLbl.text = [NSString stringWithFormat:@"緯度:%@",weidu];
    weiduLbl.textColor = UIColor.whiteColor;
    [overLayView addSubview:weiduLbl];
    UILabel * dizhiLbl = [[UILabel alloc]initWithFrame:CGRectMake(40, s_height - 202 - 200, 400, 30)];
    dizhiLbl.text = [NSString stringWithFormat:@"地址:%@",dizhi];
    dizhiLbl.textColor = UIColor.whiteColor;
    [overLayView addSubview:dizhiLbl];
    UILabel * shijianLbl = [[UILabel alloc]initWithFrame:CGRectMake(40, s_height - 170 - 200, 300, 30)];
    shijianLbl.text = [NSString stringWithFormat:@"時間:%@",currentDateStr];
    shijianLbl.textColor = UIColor.whiteColor;
    [overLayView addSubview:shijianLbl];
    UILabel * beizhuLbl = [[UILabel alloc]initWithFrame:CGRectMake(40, s_height - 138 - 200, 300, 30)];
    beizhuLbl.text = [NSString stringWithFormat:@"備注:%@",self.beizhu.text];
    beizhuLbl.textColor = UIColor.whiteColor;
    [overLayView addSubview:beizhuLbl];
    overLayView.backgroundColor = [UIColor clearColor];
    _logoImage = [self convertViewToImage:overLayView];
}

// 傳入UIView生成UIImage對象使用該方法不會模糊拨扶,根據(jù)屏幕密度計算
- (UIImage *)convertViewToImage:(UIView *)view {
    UIImage *imageRet = [[UIImage alloc]init];
    //UIGraphicsBeginImageContextWithOptions(區(qū)域大小, 是否是非透明的, 屏幕密度); 這里透明度指的是背景是否透明
    UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, [UIScreen mainScreen].scale);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    imageRet = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return imageRet;
}

ConvertViewToImage的方法拿到的圖片我們把它作為水印和拍好的照片畫到一起

// 我這里方法傳進(jìn)來的是主圖片 _logoImage是作為水印圖片
- (void)composeImg:(UIImage *)image{
    CGFloat w = 1000;
    CGFloat h = 1000;
    //以主圖片的大小作為底圖
    //以主圖片為畫布創(chuàng)建上下文
    UIGraphicsBeginImageContext(CGSizeMake(s_width, s_height));
    //先把1.png 畫到上下文中
    [image drawInRect:CGRectMake(0, 0, s_width, s_height)];
    //再把小圖放在上下文中  位子坐標(biāo)自己慢慢調(diào)整
    [_logoImage drawInRect:CGRectMake(20, 20, w, h)];
    //從當(dāng)前上下文中獲得最終圖片
    UIImage *resultImg = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();//關(guān)閉上下文
    // 預(yù)覽我們合成的照片
    [self showResultPhoto:resultImg];
}
    // 預(yù)覽我們得到的圖片 
- (void)showResultPhoto:(UIImage *)image{
    photoImage = [UIImageView new];
    photoImage.image = image;
    [self.view addSubview:photoImage];
    photoImage.frame = self.view.frame;
    saveBtn = [UIButton allloc]initWithFrame:CGRectMake(x, y, width, height)];// 保存圖片的按鈕
    [saveBtn setTitle:@"使用相片" forState:UIControlStateNormal];
    self.phtotImage = image;
    [saveBtn addTarget:self action:@selector(saveSWPhoto) forControlEvents:UIControlEventTouchUpInside];
    [saveBtn setBackgroundColor:UIColor.grayColor];
    [self.view addSubview:saveBtn];
}
// 保存所得到的圖片
- (void)saveSWPhoto{
    ShowHUBInController;
    [[PHPhotoLibrary sharedPhotoLibrary]performChanges:^{
        [PHAssetChangeRequest creationRequestForAssetFromImage:self.phtotImage];
    } completionHandler:^(BOOL success, NSError * _Nullable error) {
        if (error) {
            dispatch_async(dispatch_get_main_queue(), ^{
                HideHUBInController;;
                ShowHUBInWindowAutoHid(@"保存失敗");
            });

            NSLog(@"%@",@"保存失敗");
            NSLog(@"%@",error);
        } else {
            dispatch_async(dispatch_get_main_queue(), ^{
                HideHUBInController;
                ShowHUBInWindowAutoHid(@"保存成功");
            });
            NSLog(@"%@",@"保存成功");
        }
    }];
}

這里我們來看看軟件的截圖和拍出的照片的樣子吧


打開相機(jī)

預(yù)覽照片

保存到相冊的照片

感覺還是不錯的凳鬓,嘿嘿。有什么不好的地方麻煩大家?guī)兔χ赋龌济瘢覀児餐瑢W(xué)習(xí)缩举。
如果能幫到大家,就給我點個贊吧。謝謝大家仅孩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末托猩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辽慕,更是在濱河造成了極大的恐慌京腥,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溅蛉,死亡現(xiàn)場離奇詭異公浪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)船侧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門欠气,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人镜撩,你說我怎么就攤上這事预柒。” “怎么了琐鲁?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵卫旱,是天一觀的道長。 經(jīng)常有香客問我围段,道長顾翼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任奈泪,我火速辦了婚禮适贸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涝桅。我一直安慰自己拜姿,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布冯遂。 她就那樣靜靜地躺著蕊肥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛤肌。 梳的紋絲不亂的頭發(fā)上壁却,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機(jī)與錄音裸准,去河邊找鬼展东。 笑死,一個胖子當(dāng)著我的面吹牛炒俱,可吹牛的內(nèi)容都是我干的盐肃。 我是一名探鬼主播爪膊,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼砸王!你這毒婦竟也來了推盛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤处硬,失蹤者是張志新(化名)和其女友劉穎小槐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荷辕,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡凿跳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了疮方。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片控嗜。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖骡显,靈堂內(nèi)的尸體忽然破棺而出疆栏,到底是詐尸還是另有隱情,我是刑警寧澤惫谤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布壁顶,位于F島的核電站,受9級特大地震影響溜歪,放射性物質(zhì)發(fā)生泄漏若专。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一蝴猪、第九天 我趴在偏房一處隱蔽的房頂上張望调衰。 院中可真熱鬧,春花似錦自阱、人聲如沸嚎莉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趋箩。三九已至,卻和暖如春加派,著一層夾襖步出監(jiān)牢的瞬間阁簸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工哼丈, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人筛严。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓醉旦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子车胡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353