使用透明度合并两个图像时出现奇怪的颜色行为

时间:2012-04-12 10:38:14

标签: iphone ios core-graphics objective-c++ alphablending

这是一个已被问过的问题,但我遇到了一个我无法找到的问题,而且我不明白。

我的目标很简单:绘制背景图像,然后在其上绘制具有透明度的图像。它在开始时效果很好,当顶部图像的透明度较弱时,但是一旦顶部图像几乎透明,我就会在结果图像上得到奇怪的颜色。

这是原始图片: original image http://img406.imageshack.us/img406/7452/bidou.jpg

这是我逐渐透明的图像: mask http://img515.imageshack.us/img515/4464/loltest31.png(我在绘图时调整它的大小;我试图将其设置为原始大小,以防我的问题来自插值或类似的东西,但它没有解决问题...)

现在面具有一些透明度: mask step 4 http://img19.imageshack.us/img19/3791/loltest4.png

结果: result step 4 http://img213.imageshack.us/img213/4440/resulttest4.png

最后一个结果是,当蒙版上的透明度(我从不更改颜色数据,只有alpha值)几乎完成时(alpha = 7(从0到255的比例)): result step 1 http://img844.imageshack.us/img844/816/resulttest0.png

正如你所看到的,结果上出现了一些奇怪的颜色,比如帽子顶部的红点,而且透明度似乎并不是在同一个地方(尽管它是,因为我检查它保存面具)。更重要的是,结果图像的某些区域是完全透明的,即使我从不修改原始图像并始终先绘制它。

当蒙版完全透明时,结果与原始图像相同,但只要alpha不为0,就会产生奇怪的彩色像素。

我尝试过不同的混合模式,但没有成功。

以下是我在代码中执行此操作的方法之一:

    UIImage *bottomImage = self.originalImage;
    UIImage *image       = [self getUIImage];

    CGSize newSize = mySize;
    UIGraphicsBeginImageContext( newSize );

    // Use existing opacity as is
    [bottomImage drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];

    // Apply supplied opacity if applicable
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];

    resultImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

另一种方式(最后是相同的):

CGSize mySize = self.originalImage.size;
UIGraphicsBeginImageContextWithOptions(mySize, YES, 0);
CGContextRef globalContext = UIGraphicsGetCurrentContext();

CGContextSaveGState(globalContext);

CGContextSetBlendMode(globalContext, kCGBlendModeNormal);
CGContextDrawImage(globalContext, CGRectMake(0, 0, mySize.width, mySize.height), self.originalImage.CGImage);
CGContextDrawImage(globalContext, CGRectMake(0, 0, mySize.width, mySize.height), [self getUIImage].CGImage);

CGImageRef   resultRef = CGBitmapContextCreateImage(globalContext);
UIImage*     resultImage = [UIImage imageWithCGImage:resultRef];

CGContextRestoreGState(globalContext);
UIGraphicsEndImageContext();

任何人,任何想法?我想不出任何我没试过的事情......

编辑:带有简单4 * 2图像的结果:

 Empty:
0: 0; 0; 0; 16
1: 0; 0; 0; 16
2: 0; 0; 0; 0
3: 0; 0; 0; 0
4: 0; 0; 0; 0
5: 0; 0; 0; 0
6: 0; 0; 0; 0
7: 0; 0; 0; 0

 Bottom drawn:
0: 0; 0; 0; 255
1: 128; 0; 0; 255
2: 128; 128; 0; 255
3: 0; 128; 0; 255
4: 0; 128; 128; 255
5: 0; 0; 128; 255
6: 128; 0; 128; 255
7: 128; 128; 128; 255

 foreground:
0: 0; 0; 0; 7
1: 128; 0; 0; 7
2: 128; 128; 0; 7
3: 0; 128; 0; 7
4: 0; 128; 128; 7
5: 0; 0; 128; 7
6: 128; 0; 128; 7
7: 128; 128; 128; 7

 front drawn:
0: 0; 0; 0; 255
1: 0; 128; 128; 192
2: 128; 128; 0; 0
3: 0; 128; 0; 255
4: 0; 128; 128; 255
5: 0; 0; 128; 255
6: 128; 0; 128; 0

0 个答案:

没有答案