2011-08-28 41 views
3

合成圖像時我試圖兩張照片(有孔的臉在不同的人的面部圖像的頂部認爲體)結合成一個圖像。 頂部圖像有一些半透明的像素和一些完全透明的像素,我想覆蓋它的實體圖像的頂部。腐敗像素的iOS

以下是我在做什麼: 我有一個正確的大小的上下文,並在其上繪製底部圖像,沒有任何alpha(faceImage)。 最重要的是我繪製中有一個透明孔的圖像,與透明膠片的各種級別(coverImage):

UIGraphicsBeginImageContext(view.bounds.size); 
[faceImage drawAtPoint:CGPointMake(0, 0) blendMode:kCGBlendModeNormal alpha:1]; 
[coverImage drawAtPoint:CGPointMake(0, 0) blendMode:kCGBlendModeNormal alpha:1]; 
UIImage *combinedImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

在最終圖像中的結果是相當出人意料:

在像素,其中在頂部圖像沒有透明度最終圖像的正確保存和顯示從頂部圖像像素。 (

在其中頂部圖像具有充分的透明度最終圖像被適當地保存並示出了從底部圖像像素的像素。 (

在其中頂部圖像具有半透明像素和亮度非常光的像素(最終像素的亮度)突然得到完全透明像素(而不是最終像素沒有透明度,這是頂部像素和底部像素之間的混合)。 (WTF?)

在圖像中可以看到的白色斑點怪異。這些都是成爲完全透明像素的像素(你看到過它們的白色背景): The combined image with the weird transparent pixels

這是我把頂部的圖像:

The top image with the semi transparent pixels

這是面子底部圖像:

The face image on the bottom

任何想法可能是造成這個?

TIA

回答

2

我們從未真正發現過導致問題的原因,但確實發現當您更改應用程序中半透明圖像的亮度並保存時,會發生問題。如果預加載明亮的圖像,則不會發生問題。

(或許這跟iPhone優化的PNG,如俄德的鏈接描述)

因此,作爲一個變通解決問題的亮度發生變化後,我們只是暫時保存圖像,然後使用保存最終混合圖像。 下面是我們添加的代碼:

NSData *coverImageData = UIImagePNGRepresentation(coverImage); 
coverImage = [UIImage imageWithData:coverImageData]; 

正如你所看到的,我們實際上並不將圖像保存爲一個文件,這足以將其保存爲PNG表示,然後加載回來。

完整的黑客,但它的工作。

+0

預先相乘,這也解決了我的問題。在這個蹩腳的問題上,我現在頭撞牆了一天。 –

2

2一般可能的線索:

  1. 是你繪製不透明的看法? (http://stackoverflow.com/questions/1451977/transparent-color-works-on-the-simulator-but-becomes-black-on-the-iphone)
  2. 一些有關的alpha通道被預乘( http://iphonedevelopment.blogspot.com/2008/10/iphone-optimized-pngs.html)

乾杯,

俄德。

+0

是的,它絕對預乘alpha發行。所有的顏色分量應該與alpha(0..1.0) –