这是一个已被问过的问题,但我遇到了一个我无法找到的问题,而且我不明白。
我的目标很简单:绘制背景图像,然后在其上绘制具有透明度的图像。它在开始时效果很好,当顶部图像的透明度较弱时,但是一旦顶部图像几乎透明,我就会在结果图像上得到奇怪的颜色。
这是原始图片: 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