这是一个已经被问过的问题,但是我遇到了一个我在任何地方都找不到并且我不理解的问题。
我的目标很简单:绘制背景图像,然后在其上绘制具有透明度的图像。一开始效果很好,当顶部图像的透明度很弱时,但是一旦顶部图像几乎透明,我就会在结果图像上得到奇怪的颜色。
这是原图: 原图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
最后一个结果是,当蒙版上的透明度(我从不更改颜色数据,只有 alpha 值)几乎完成时(alpha=7(从 0 到 255)):
如您所见,结果上出现了一些奇怪的颜色,例如帽子顶部的红点,并且透明度似乎不是在所有地方都处于同一水平(虽然是,因为我通过保存蒙版来检查它)。更重要的是,结果图像的某些区域是完全透明的,即使我从不修改原始图像并且总是先绘制它。
当遮罩完全透明时,结果与原始图像相同,但只要 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