2

这是一个已经被问过的问题,但是我遇到了一个我在任何地方都找不到并且我不理解的问题。

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

这是原图: 原图http://img406.imageshack.us/img406/7452/bidou.jpg

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

现在有了一些透明度的面具: 面具步骤4 http://img19.imageshack.us/img19/3791/loltest4.png

结果: 结果步骤 4

最后一个结果是,当蒙版上的透明度(我从不更改颜色数据,只有 alpha 值)几乎完成时(alpha=7(从 0 到 255)): 结果步骤 1

如您所见,结果上出现了一些奇怪的颜色,例如帽子顶部的红点,并且透明度似乎不是在所有地方都处于同一水平(虽然是,因为我通过保存蒙版来检查它)。更重要的是,结果图像的某些区域是完全透明的,即使我从不修改原始图像并且总是先绘制它。

当遮罩完全透明时,结果与原始图像相同,但只要 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
4

0 回答 0