前言
作為一個iOS開發人員,我已經不知不覺的在帝都這個地方上干了塊兩年了。前一陣,由于公司的發展方向的問題,我被迫加入了找工作的大軍之中。這可把我擔心壞了,因為我之前的一個同事找了好久都沒有找到工作,之后他就選擇回老家發展了。做過iOS這行的都知道現在是什么行情了,我就不多說了。不過還好我找了一周左右吧,面試不少。但是現在招人的公司,真的不知道要招什么樣的開發人員,面試草草了事的偏多。還有就是自認為大牛的比較多,我記得我面了一家智能家居的科技公司。那個面試我的面試官,看了我做過的產品。就給我說了一句:“你就是個調接口和寫TableView的啊。”這話聽起來真的讓人難受,用一句很流行的話說,那就是“扎心了,老鐵”。我仔細一想,也確實。現在的App,基本都是這樣的啊。基本都是項目需求是什么做什么。所以我覺得 我不能在這么下去了。
GPUImage
上面說了,我打算自己做做新的功能。突然間,就對相機這個模塊感興趣了。畢竟現在是全民P圖,全民美顏的時代。我還記得我小的時候看電視有這么一句臺詞“美不美,看大腿”。在現在應該是“美不美,看美顏”。
我就上網找了一下,偶然間發現了一個名為GPUImage
的。好像是可以做到我想要的效果的,它內置了很多的濾鏡效果,共125個濾鏡, 分為四類
Color adjustments: 31 filters, 顏色處理相關
Image processing: 40 filters, 圖像處理相關.
Blending modes: 29 filters, 混合模式相關.
Visual effects: 25 filters, 視覺效果相關.
這里我就不把濾鏡的效果一一的列舉出來了,有興趣的可以去看gpuimage的各種濾鏡簡介或GPUImage濾鏡列表 后面這個是簡書的文章,推薦!!
GPUImage之相機
要實現相機的效果主要有如下幾個變量:
@property (nonatomic, strong) GPUImageStillCamera *camera;
可以理解為設備
@property (nonatomic, strong) GPUImageView *imageView;
用于顯示的View
其實主要的變量還有一個就是你的濾鏡。
首先,我不是學計算機出身的一個iOS菜雞,對于那些什么美顏算法什么的真的是搞不明白。我就上網找了一個,在我的demo中有,你也可以調用系統的濾鏡文件。
//AVCaptureDevicePositionBack為后攝像頭 front為前置攝像頭
//AVCaptureSessionPreset1920x1080為分辨率 另外還支持多種分辨率
//AVCaptureSessionPreset1280x720 等等等等
- (GPUImageStillCamera *)camera{
if (!_camera) {
_camera = [[GPUImageStillCamera alloc]initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:AVCaptureDevicePositionBack];
_camera.outputImageOrientation = UIInterfaceOrientationPortrait;
//設置前置攝像頭鏡像問題
_camera.horizontallyMirrorFrontFacingCamera = YES;
}
return _camera;
}
//濾鏡
- (GPUImageBeautifyFilter *)filter{
if (!_filter) {
_filter = [[GPUImageBeautifyFilter alloc]init];
}
return _filter;
}
- (GPUImageView *)imageView{
if (!_imageView) {
_imageView = [[GPUImageView alloc]initWithFrame:CGRectMake(0, 0, WIDTH, HEIGHT)];
//顯示模式
_imageView.fillMode = kGPUImageFillModePreserveAspectRatioAndFill;
}
return _imageView;
}
這只是初始化,然后這3個變量之間還要添加一下
[self.camera addTarget:self.filter];
[self.filter addTarget:self.imageView];
[self.view addSubview:self.imageView];
到此為止,你就萬事俱備了,只差東風了。你一定會問,東風是什么?那么我就告訴你,東風就是[self.camera startCameraCapture];
這個時候你的相機就可以捕獲視圖了。
那么接下來,咱么就要給自己自定義的相機增加一些相應的功能按鈕,例如拍照, 旋轉攝像頭之類的 都是標配
當我們按下拍照按鈕的時候調用
[self.camera capturePhotoAsImageProcessedUpToFilter:self.filter withCompletionHandler:^(UIImage *processedImage, NSError *error) {
if (error) {
return ;
}
//成功了
[self successCutPic:processedImage];
}];
返回的那個processedImage
就是你的照片了,然后你就去存儲這張照片就可以了。當然了,你此時就用該讓你的相機停止捕獲視圖[self.camera stopCameraCapture];
然后再去存。
旋轉攝像頭,GPUImage自己就有相應的方法[self.camera rotateCamera]
忘記說了一個事情,在Github下載下來的GPUImage還需要你自己去編譯libGPUImage.a
文件。如果不會的話可以去看看GPUImage集成上面寫的很詳細了。