2014-11-01 68 views
0

所以我在處理圖像裁剪時遇到了一些問題。我有兩種可能的方法:UIGraphicsBeginImageContextWithOptions結合drawAtPoint:blendMode:方法和CGImageCreateWithImageInRect。他們都工作,但有一些嚴重的缺點:第一種方式需要大量的時間(在我的情況下約7秒)和記憶(我收到內存警告)(假設我裁剪用iPhone相機拍攝的圖像);第二個結束與旋轉的圖像,以便您需要投入一堆代碼來打敗這種行爲,我不想要。我想知道的是,例如,如何在「照片」應用程序的編輯功能中使用蘋果,或者Aviary或任何其他照片編輯器。考慮一下蘋果的編輯器(iOS 8),你可以旋轉圖像,改變裁剪矩形,它們在裁剪矩形之外也具有模糊(!)等等,但是當你應用裁剪時,它最多需要8MB的內存,並且它立即發生。他們如何做到這一點?如何使用Open GL ES裁剪圖像?

我唯一的想法就是他們使用GPU的潛力(例如Aviary)。所以,如果我們將所有這些問題合而爲一,那麼我怎樣才能使用Open GL來使裁剪不那麼痛苦?我從來沒有使用它,所以任何嘖嘖,鏈接和來源是受歡迎的。謝謝你提前。

+0

OpenGL及其衍生物是用於繪製東西的API,最終顯示在屏幕上。核心目的是在實時圖形渲染中使用。你的任務是通用圖像處理,這對於OpenGL是可能的,但通常使用專用圖像操作庫更容易完成。 – datenwolf 2014-11-01 12:32:24

+0

@datenwolf好的,你能說出一些嗎? – efimovdk 2014-11-01 13:00:16

回答

0

如前所述這應該最有可能不能使用OpenGL做,但即使...

這個問題大多數人都越來越其中圖像應顯示與解決方案看起來像這樣的矩形:

- (CGRect)fillSizeForSource:(CGRect)source target:(CGRect)target 
{ 
    if(source.size.width/source.size.height > target.size.width/target.size.height) 
    { 
     // keep target height and make the width larger 
     CGSize newSize = CGSizeMake(target.size.height * (source.size.width/source.size.height), target.size.height); 
     return CGRectMake((target.size.width-newSize.width)*.5f, .0f, newSize.width, newSize.height); 
    } 
    else 
    { 
     // keep target width and make the height larger 
     CGSize newSize = CGSizeMake(target.size.width, target.size.width * (source.size.height/source.size.width)); 
     return CGRectMake(.0f, (target.size.height-newSize.height)*.5f, newSize.width, newSize.height); 
    } 
} 

- (CGRect)fitSizeForSource:(CGRect)source target:(CGRect)target 
{ 
    if(source.size.width/source.size.height < target.size.width/target.size.height) 
    { 
     // keep target height and make the width smaller 
     CGSize newSize = CGSizeMake(target.size.height * (source.size.width/source.size.height), target.size.height); 
     return CGRectMake((target.size.width-newSize.width)*.5f, .0f, newSize.width, newSize.height); 
    } 
    else 
    { 
     // keep target width and make the height smaller 
     CGSize newSize = CGSizeMake(target.size.width, target.size.width * (source.size.height/source.size.width)); 
     return CGRectMake(.0f, (target.size.height-newSize.height)*.5f, newSize.width, newSize.height); 
    } 
} 

我沒有測試這個。

或者既然你是在iOS上,只需創建一個具有所需大小的圖像視圖,添加一個圖像,然後獲取圖像的屏幕截圖。

+0

所以這些方法會將我的源矩形切換爲將由CGImageCreateWithImageInRect使用的矩形? – efimovdk 2014-11-05 19:25:46

+0

該函數創建一個給定矩形的子圖像,當其中一個維度等於原始圖像時,該矩形應該可以與擬合方法一起使用。換句話說:不,因爲它不會調整圖像大小。您可以使用這些方法獲取將圖像繪製到定製核心圖形上下文的位置(目標大小應該是上下文大小)。或者你可以使用它們用openGL重新繪製圖像。或者使用目標矩形創建一個視圖,然後添加一個子視圖圖像視圖以及方法rect以獲得相同的結果... – 2014-11-05 19:42:05