? 早在大二上學(xué)期初,就有獨立制作一款攝影類app的打算,但是那是時間不多能力不足也就擱淺了。后來中途接觸了類似于HUJI Poly Filmborn等優(yōu)秀攝影類app的時候心里那頭小鹿又開始亂撞,于是便開始了翻資料碼代碼的生活椅邓,以下是我運用GPUImage框架制作一款相機app(暫時還未上架)的過程遇到過的坑,希望對你有所幫助昧狮。
一景馁、關(guān)于GPUImage
官方描述:The GPUImage framework is a BSD-licensed iOS library that lets you apply GPU-accelerated filters and other effects to images, live camera video, and movies. In comparison to Core Image (part of iOS 5.0), GPUImage allows you to write your own custom filters, supports deployment to iOS 4.0, and has a simpler interface. However, it currently lacks some of the more advanced features of Core Image, such as facial detection.? ? GPUImage是使用GPU處理圖像的、他可以對圖片逗鸣、實時畫面合住、視頻進行處理。他允許你自定義濾鏡撒璧、支持iOS4.0透葛。然而,目前缺乏核心形象的一些更高級的功能,比如面部檢測。
GPUImage框架能排入ios框架排行榜的前十卿樱,是名副其實的ios老牌框架僚害,由于目前的直播以及美顏類相機app的大火,GPUImage框架也是制作這些app時的不二之選
二繁调、Q&A(問題與解決辦法)
Q1:linker command failed with exit code 1 (use -v to see invocation)問題的解決辦法
A1:cocopods導(dǎo)入后記得關(guān)閉整個項目然后從.xcworkspace文件進入
Q2:制作模擬相機界面時如何隱去status bar讓主界面全屏顯示
A2: info.plist->Status bar is initially hidden-YES;View controller-based status bar appearance-NO;
Q3:錯誤提示Failed to read file attributes for "/Users/zhangyunzhu/Downloads/XRWaterfallLayout-master/XRWaterfallLayoutDemo/XRWaterFallLayoutDemo/Assets.xcassets"
A3:刪除Assets.xcassets里面變紅的圖片文件
Q4:image.JPG找不到警告
A4: 由于大多數(shù)的圖片素材都都來源于網(wǎng)絡(luò)萨蚕,圖片格式結(jié)尾層次不齊如.jpg .JPG .svg .png等等,所以——注意大小寫? 注意大小寫 注意大小寫 重要的事情說三遍涉馁,哦對了门岔,還有間隔符也要看一下爱致,能刪則刪代碼里面imageNamed看得出區(qū)別烤送。
Q5:在從github上導(dǎo)入項目時候顯示如圖錯誤(很常見)
A5:由于蘋果官方的限制每周提供給開發(fā)者的Bundle Identifier有限,建議在創(chuàng)建好新的工程并且順利運行之后保存一下BI碼供其他項目使用糠悯。
Q6:The app's Info.plist must contain an NSPhotoLibraryAddUsageDescription key with a string value explaining to the user how the app uses this data.問題
A6:info.plist-Photo Library Additions Usage Description-想訪問圖庫
Q7:關(guān)于相機app拍攝后實際生成圖片的方向和拍攝時的的方向不一致的問題
A7:實際上iOS手機豎著拍出的照片與橫著拍出的照片對于拍攝者來說是一樣的帮坚,只不過豎著拍出的照片被添加了一個順時針旋轉(zhuǎn)90°的拍照方向妻往,所以顯示的時候,就變成了上下邊窄左右邊寬的狀態(tài)试和,其實也就是橫著拍的照片順時針旋轉(zhuǎn)90°而成的
比如這樣:
這里參考文章:https://www.cnblogs.com/gaoxiaoniu/p/5329834.html
- (UIImage *)normalizedImage {
? ? if(self.imageOrientation == UIImageOrientationUp)return self;
? ? UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
? ? [self drawInRect:(CGRect){0,0, self.size}];
? ? UIImage *normalizedImage = UIGraphicsGetImageFromCurrentImageContext();
? ? UIGraphicsEndImageContext();
? ? return normalizedImage;
}
代碼大致的意思是獲取所拍攝下來的照片的方位讯泣,如果方位不是UIImageOrientationUp,那么則將它重新繪制在畫板上阅悍,此時drawInRect會和系統(tǒng)圖庫一樣將他好渠。
這里多插一句,ios相機拍照時原始方向是home鍵向右的方向而并不是平時刷微信的home鍵朝下的方向节视。
但是拳锚,這個方法可能會有畫質(zhì)上的損失這里有個更好的方法:
減小畫質(zhì)損失方法
來源:http://blog.csdn.net/iphone5solo/article/details/49623261
CGSize size? = {390, 430}; //新手注意:CGSize是一個結(jié)構(gòu)體類型,不是對象寻行,所以變量前不加'*'號;
? ? if([[UIScreen mainScreen] scale] == 2.0){? ? ? // @2x
? ? ? ? UIGraphicsBeginImageContextWithOptions(size, NO, 2.0);
? ? }else if([[UIScreen mainScreen] scale] == 3.0){ // @3x ( iPhone 6plus 霍掺、iPhone 6s plus)
? ? ? ? UIGraphicsBeginImageContextWithOptions(size, NO, 3.0);
? ? }else{
? ? ? ? UIGraphicsBeginImageContext(size);
? ? }
? ? // 繪制改變大小的圖片
? ? [imager drawInRect:CGRectMake(100, 0, size.width, size.height)];
? ? // 從當(dāng)前context中創(chuàng)建一個改變大小后的圖片
? ? UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
? ? // 使當(dāng)前的context出堆棧
? ? UIGraphicsEndImageContext();
? ? // 返回新的改變大小后的圖片
? ? imager = scaledImage;
? ? //處理按鈕點擊事件
? ? ? ? [self.testbtn addTarget:self action:@selector(TouchDown)forControlEvents: UIControlEventTouchDownInside];?
? ? //處理按鈕松開狀態(tài)
? ? ? ? [self.testbtn addTarget:self action:@selector(TouchUp)forControlEvents: UIControlEventTouchUpInside | UIControlEventTouchUpOutside];?
But: 我在使用這個方法試圖矯正所拍攝照片的時候失敗了,可能的原因是我用GPUImageFilterGroup為其添加了一層濾鏡拌蜘,然后他的imageOrientation被初始化了杆烁,NSLog大法顯示無論我橫著拍還是正著拍都是UIImageOrientationRight,這個問題我還沒有深究简卧,如果有知道的小伙伴可以私信我簡書兔魂。
三、分享一些省時省力的小Tips
1.一個快速圖標(biāo)生成的網(wǎng)站举娩,以后圖標(biāo)適配不用再苦逼的用ps改分辨率了? ? ? http://www.atool.org/ios_logo.php
2.3d touch實現(xiàn)快拍功能:
// 2.在appdelegate.m里寫處理點擊3D touch 方法的功能實現(xiàn)
-(void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
? ? if ([shortcutItem.type isEqualToString:@"Camera"]) {
? ? ? ? NSLog(@"開拍");
? ? }
實現(xiàn)效果:
注意:如果你在為系統(tǒng)“分享”犯愁的話入热,我悄悄的告訴你,這個是上架后系統(tǒng)自帶的系統(tǒng)分享功能(心在滴血)
四晓铆、展望
下一篇可能(可能勺良,我說的是可能)會介紹一些關(guān)于顏色查找表lookup快速制作濾鏡、GPUImage2(Swift)以及項目demo和FILMMY相機的真容啦(???)?