2013-08-03 123 views
2

我試圖在我的應用中創建一個允許用戶提取現有圖像的指定區域的功能,並將其保存爲啓用Alpha的png。爲UIImage創建alpha

我已經把UIView ontop的一個UIImageView的 - 的imageView顯示圖像,而你是在透明view繪製你的面具。對於繪圖,我使用UIBezierPath。用戶可以在物體周圍畫畫,而裏面會暫時填充黑色。

用戶從照片卷中選取圖像,如左圖所示,並在底層UIImageView中顯示,當用戶繪製了一個形狀(自動關閉)時,在覆蓋的UIView上,它看起來像右圖:

Without mask With drawn-on mask

這工作正常,但是當用戶然後單擊「裁剪」,那麼魔術應該開始。到目前爲止,我只能夠創建一個「面具」,並將其保存爲上滾動的圖像,如在此處顯示(心中永遠的縱橫比,那我下次再收拾):

Saved "mask" Image and the generated "mask"

這只是一個普通的圖像,從路徑/形狀創建,顏色(白底黑,透明不黑)。 我需要的是使用這個「圖像」作爲原始圖像的alpha通道的一些方法。

我知道這些是兩個完全分開的東西,即一個alpha通道與圖像不一樣,但我具有這種形狀,所以我想知道是否有任何可能的方式來「裁剪」或用我的數據「alpha out」。我想結束了,這是貓的臉的PNG,與周圍環境100%透明(或甚至不存在),這樣我可以改變的背景下,這樣的:

Transparent white background Transparent orange background

重要的是要注意我是談論展示與應用的蒙一個UIImageView一個UIImage,我說的是創建一個新的形象,立足現有的圖像上,與其它圖像相結合,我想很重要以某種方式轉換爲第一個圖像的alpha通道,從而節省一個像上面的圖像,透明度。

我不是太熟悉圖像處理的數據,所以我想知道是否有人知道如何基於兩個圖像,一個充當阿爾法另一方面,當既沒有圖像的塑造新形象必須有一個alpha通道開始。

回答

2

的方法,下面將你的原始圖像和掩模圖像(黑色形狀),並返回一個UIImage僅包括由掩模覆蓋的所述圖像的內容:

+ (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *) mask 
{ 
    CGImageRef imageReference = image.CGImage; 
    CGImageRef maskReference = mask.CGImage; 

    CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(maskReference), 
              CGImageGetHeight(maskReference), 
              CGImageGetBitsPerComponent(maskReference), 
              CGImageGetBitsPerPixel(maskReference), 
              CGImageGetBytesPerRow(maskReference), 
              CGImageGetDataProvider(maskReference), 
              NULL, // Decode is null 
              YES // Should interpolate 
              ); 

    CGImageRef maskedReference = CGImageCreateWithMask(imageReference, imageMask); 
    CGImageRelease(imageMask); 

    UIImage *maskedImage = [UIImage imageWithCGImage:maskedReference]; 
    CGImageRelease(maskedReference); 

    return maskedImage; 
} 

掩模之外的區域將是透明的。然後,您可以將生成的UIImage與背景顏色組合在一起。

+0

謝謝,我會在一兩天內檢查一下,但這看起來像是需要第二張圖片的alpha值,並將其應用於第一張圖片,而且我不認爲我創建的圖案有一個alpha通道就像現在一樣,但我會盡力找到一種方法來實現這一點。我想這兩個圖像應該是完全相同的大小。我會嘗試一些東西,希望很快回來好消息:) – Sti

+0

這最後工作。我發現我已經試過了,但事實證明,我發送的一張圖像有一個虛擬的alpha通道,將其搞亂了。在發送到此方法之前將它們都轉換爲JPEG時,它完美運行,謝謝。 (雖然它看起來不適用於iOS7) – Sti