IOS Photo Editing Extensions|照片編輯擴(kuò)展玩法

iOS 8之后业舍,APPLE公司提供IOS應(yīng)用擴(kuò)展點(diǎn)Extension points(最近更新的ios10 又增加了iMessage功能擴(kuò)展)眷蜓。這些提供給操作系統(tǒng)的前所未有的訪問肛宋,比如照片編輯的擴(kuò)展,允許開發(fā)人員可以構(gòu)建功能到系統(tǒng)相冊應(yīng)用。

比如實(shí)現(xiàn)以下照片編輯效果

photo extension.gif

或者自己做個(gè)貼圖的編輯應(yīng)用

photo extension2.gif

1荆秦、創(chuàng)建Photo Editing Extension Target

創(chuàng)建一個(gè)新的target徐钠,選擇 Photo Editing Extension

new target.png

接著需要在info.plist添加配置信息

info.plist.png

NSExtensionPointIdentifier:照片編輯與擴(kuò)展
PHSupportedMediaTypes:設(shè)置支持編輯的類型是image類型
NSExtensionMainStroyboard:storyboard名

創(chuàng)建之后你會發(fā)現(xiàn)新target下多了PhotoEditingViewControllerMainInterface.storyboard這兩個(gè)文件癌刽,這兩個(gè)是編輯圖片時(shí)候的視圖控制器,我們可以在storyboard上面創(chuàng)建UI

MainInterface.storyboard.png

這里我添加collectionView于底部,實(shí)現(xiàn)如下卡片式選擇的效果

Screen Shot 2016-09-23 at 下午3.02.25.png

2显拜、實(shí)現(xiàn)圖片加載到控制器中

我們通過圖庫中【選擇圖片->進(jìn)入編輯模式->選擇編輯程序】 來進(jìn)入我們的應(yīng)用衡奥,控制器開啟的時(shí)候,會進(jìn)入到PHContentEditingController的以下代理方法里面

- (void)startContentEditingWithInput:(PHContentEditingInput *)contentEditingInput placeholderImage:(UIImage *)placeholderImage {
//在這里獲取選擇圖片远荠,顯示到我們的控制器中    
    self.input = contentEditingInput;
    
    CGFloat imageWidth = placeholderImage.size.width;
    
    CGFloat imageHeight = placeholderImage.size.height;
    
    _proportion = imageWidth/imageHeight;
    
    self.imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.width/_proportion)];
    
    self.imageView.contentMode = UIViewContentModeScaleAspectFit;
    
    self.imageView.userInteractionEnabled = YES;
    
    self.imageView.image = placeholderImage;
    
    [self.imageView addGestureRecognizer:self.tapGesture];
    
    self.imageView.center = CGPointMake(self.view.bounds.size.width/2, self.view.bounds.size.height/2);
    
    [self.view insertSubview:self.imageView belowSubview:self.toolView];
    
    _inputImage = placeholderImage;

}

3矮固、處理圖片

拿到將要編輯的圖片之后,就要對圖片進(jìn)行修改了譬淳,我這里是給圖片添加一個(gè)貼圖,這里我就省略了collectionView的一些代理方法了档址,詳情請移步Demo

#pragma mark - 繪制貼圖到圖片中
-(UIImage *)addImageLogo:(UIImage *)img text:(UIImage *)logo
{
    CGFloat selectImageW = 60.0f;
    
    CGFloat orginImageW = self.imageView.frame.size.width;

    CGFloat persen = selectImageW/orginImageW;
    
    //get image width and height
    int w = img.size.width;

    int h = img.size.height;

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    //create a graphic context with CGBitmapContextCreate
    CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 44 * w, colorSpace, kCGImageAlphaPremultipliedFirst);

    CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage);

    CGContextDrawImage(context, CGRectMake(_iconPoint.x , _iconPoint.y-w*persen, w*persen, w*persen), [logo CGImage]);

    CGImageRef imageMasked = CGBitmapContextCreateImage(context);
    CGContextRelease(context);

    CGColorSpaceRelease(colorSpace);

    return [UIImage imageWithCGImage:imageMasked];

}

4、完成編輯邻梆、回調(diào)圖片

當(dāng)結(jié)束編輯的時(shí)候會來到這個(gè)代理方法里面(通過我們對圖片的一系列處理之后守伸,生成JPEG的 output 圖片,回調(diào)給completionHandler

- (void)finishContentEditingWithCompletionHandler:(void (^)(PHContentEditingOutput *))completionHandler {
    // Update UI to reflect that editing has finished and output is being rendered.
    
    // Render and provide output on a background queue.
    dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0), ^{
        // Create editing output from the editing input.
        
        PHContentEditingOutput *output = [[PHContentEditingOutput alloc] initWithContentEditingInput:self.input];
        
        NSData *imageData = UIImageJPEGRepresentation([self addImageLogo:self.imageView.image text:_selectImage],1.0);
        
        PHAdjustmentData *adjustmentData = [[PHAdjustmentData alloc]initWithFormatIdentifier:formatIdentifier formatVersion:formatVersion data:imageData];
        
        // Provide new adjustments and render output to given location.
        output.adjustmentData = adjustmentData;
        
        NSData *renderedJPEGData = imageData;
        
        [renderedJPEGData writeToURL:output.renderedContentURL atomically:YES];
        
        // Call completion handler to commit edit to Photos.
        
        NSLog(@">>>>>>finishContent");
        
        completionHandler(output);
        
        // Clean up temporary files, etc.
    });
}

5浦妄、運(yùn)行

選擇Photo editing extension的target尼摹,然后command+R,選擇運(yùn)行到圖庫上

Debugging.png

接著剂娄。蠢涝。。阅懦。

Paste_Image.png

(ps)如果找不到擴(kuò)展應(yīng)用惠赫,在more里面選中即可

more.png
choose.png

6、內(nèi)存限制

擴(kuò)展并不是完整的iOS應(yīng)用程序故黑,因此允許有限制地訪問系統(tǒng)資源儿咱。更具體地說,如果它使用了太多的內(nèi)存场晶,操作系統(tǒng)將殺死一個(gè)擴(kuò)展混埠。所以,如果沒有硬性限制诗轻,我建議盡量減少內(nèi)存占用钳宪。
有以下建議可以做你的圖片編輯的擴(kuò)展的內(nèi)存使用量保持在最低水平:

1、使用顯示圖像的尺寸:當(dāng)開始編輯處理中扳炬,系統(tǒng)提供適當(dāng)?shù)乜s放的屏幕圖像吏颖。使用代替了原來的交互式編輯階段,這將節(jié)省顯示圖片的內(nèi)存恨樟。

** 2半醉、限制Core Graphics上下文的數(shù)量:**如果需要使用上下文,則該數(shù)目應(yīng)該減少到最低限度劝术。

3缩多、使用GPU:可通過Core Image或第三方框架GPUImage呆奕,減少內(nèi)存占用。


小結(jié):這個(gè)開發(fā)過程其實(shí)不復(fù)雜衬吆,而注意的一點(diǎn)就是內(nèi)存的處理梁钾,盡量不要使用太占內(nèi)存的操作。大家可以嘗試一下其他的應(yīng)用擴(kuò)展逊抡,例如IOS10的IMessage 開發(fā)也是前所未有的嘗試姆泻。

各位朋友可以嘗試自己敲一下哈,還有各路大神多多指教冒嫡!
附上Demo:Demo_1 拇勃、 Demo_2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市灯谣,隨后出現(xiàn)的幾起案子潜秋,更是在濱河造成了極大的恐慌,老刑警劉巖胎许,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峻呛,死亡現(xiàn)場離奇詭異,居然都是意外死亡辜窑,警方通過查閱死者的電腦和手機(jī)钩述,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來穆碎,“玉大人牙勘,你說我怎么就攤上這事∷鳎” “怎么了方面?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長色徘。 經(jīng)常有香客問我恭金,道長,這世上最難降的妖魔是什么褂策? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任横腿,我火速辦了婚禮,結(jié)果婚禮上斤寂,老公的妹妹穿的比我還像新娘耿焊。我一直安慰自己,他們只是感情好遍搞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布罗侯。 她就那樣靜靜地躺著,像睡著了一般尾抑。 火紅的嫁衣襯著肌膚如雪歇父。 梳的紋絲不亂的頭發(fā)上蒂培,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天再愈,我揣著相機(jī)與錄音榜苫,去河邊找鬼。 笑死翎冲,一個(gè)胖子當(dāng)著我的面吹牛垂睬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播抗悍,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼驹饺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缴渊?” 一聲冷哼從身側(cè)響起赏壹,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎衔沼,沒想到半個(gè)月后蝌借,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡指蚁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年菩佑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凝化。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡稍坯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搓劫,到底是詐尸還是另有隱情瞧哟,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布枪向,位于F島的核電站勤揩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏遣疯。R本人自食惡果不足惜雄可,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缠犀。 院中可真熱鬧数苫,春花似錦、人聲如沸辨液。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滔迈。三九已至止吁,卻和暖如春被辑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背敬惦。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工盼理, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俄删。 一個(gè)月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓宏怔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親畴椰。 傳聞我的和親對象是個(gè)殘疾皇子臊诊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容