使用硬光混合模式时的高光伪影

我正在使用顶部图像的HardLight混合模式在我的iPhone应用程序中混合两个图像。 它看起来像这样:

UIGraphicsBeginImageContext(size); [sourceImage drawInRect:rectangle blendMode:kCGBlendModeNormal alpha:1.0]; [effectOverlay drawInRect:rectangle blendMode:kCGBlendModeHardLight alpha:0.75]; mainImage.image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); 

它工作正常。 但是,图像中的高光溢出会出现奇怪的颜色伪影。 请注意此照片右下角的紫色神器:

http://sofzh.miximages.com/objective-c/artifact.jpg http://sofzh.miximages.com/objective-c/artifact.jpg

这只发生在硬灯上; 其他混合模式都很好。 谁知道该怎么办?

这个问题很烦人。 有人向Apple提交了错误报告吗?

尽管如此,这是另一种解决方法,它似乎比我在这里看到的特殊方法(这对我不起作用)更可靠地解决问题。 知道混合模式HardLight与Overlay相同是很有用的,只有切换了两个参数。 而事实是Overlay的iOS实现并没有错误。 因此,您需要移动绘图(并且可能使用UIGraphicsGetImageFromCurrentImageContext等进行中间快照拍摄),以便按切换顺序绘制两个图像。 这样您就可以使用Overlay而不是HardLight。

因此,对于您的示例,将代码更改为:

  UIGraphicsBeginImageContext(size); [effectOverlay drawInRect:rectangle blendMode:kCGBlendModeNormal alpha:0.75]; [sourceImage drawInRect:rectangle blendMode:kCGBlendModeOverlay alpha:1.0]; mainImage.image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); 

希望这可以帮助。

我正在使用kCGBlendModeColor获得类似的工件。 我不认为这是一个色彩空间问题。 在计算像素值时,看起来iOS不会在255处钳位。 绝对是操作系统中的一个错误。 很遗憾,因为那就像图像处理101。

我能够确认这可能是一个色彩空间问题。 我使用一个名为Opacity的应用程序来直观地创建形状,混合效果,阴影等,并将结果导出到Core Graphics代码。 我碰巧使用的是Hard Light混合模式,但是Opacity中的一切似乎都很好。 然而,当我在iOS上导出并运行代码时,我得到了相同的工件。

这不是一个完全正确的解决方案,但在我的情况下,我只是掩盖并填充纯色,与其上方的图像混合(硬光)。 我注意到这些伪影只发生在亮度为100%的填充颜色上 。 将亮度设置为99%解决了我的特殊问题。 然而,对于混合图像和东西,我认为你将不得不玩色彩空间。

我可能错了。 我当然不是色彩专家。

找到解决方案/解决方法……

只需浏览您的图像并将任何像素255,255,255更改为254,254,254,您就不会看到这些文物。

只是为我工作。

为了清楚起见,在我的例子中,我有一个上下文,其中有要着色的图像和一个CGImage,其中包含我想要使用带有kCGBlendModeColor的CGDrawImage来着色的颜色。 我只是从上下文中创建一个临时图像,遍历每个像素寻找255,255,255并将这些像素更改为254,254,254。然后我将该图像放回上下文并使用kCGBlendModeColor绘制色调图像,并且都很好。

希望有所帮助。

我和kCGBlendModeNormal有同样的问题。 我有一个方法,用两个特定的alpha和某种混合模式覆盖两个图像:

 - (UIImage *)overlayImage:(UIImage *)image withBlendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha { CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height); UIGraphicsBeginImageContext(self.size); CGContextSetInterpolationQuality(UIGraphicsGetCurrentContext(), kCGInterpolationHigh); [self drawInRect:rect blendMode:kCGBlendModeNormal alpha:0.99]; [image drawInRect:rect blendMode:blendMode alpha:alpha * 0.99]; UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return result; } 

使用.99最大值为alpha确保我不会有255,255,255的任何像素。我希望这会有所帮助