2011-08-28 190 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) –