2012-07-15 124 views
0

我试图覆盖2个图像。将底部图像从图像库加载到Alpha设置为1.0的UIImageView对象中。此图像中的所有像素也具有1.0的alpha值。我在上下文中创建的第二个图像。该图像的alpha值因像素而异。在上下文中创建第二个图像后,我将其绘制到第一个UIImageView顶部显示的第二个UIImageView。这第二个UIImageView也有一个alpha设置为1.0。这两个UIImageView都有背景属性设置为清除。UIImage混合模式问题

我试图在运行时使用滑块更改第二个图像中像素的单独alpha值,但是,我无法获得第二个图像的RGB值以便与第一个图像正确混合。我不想基于亮度,黑暗度等进行混合。似乎我想要kCGBlendModeCopy,但这似乎仍然基于明度或其他参数进行混合。

为了帮助可视化问题:想象一下,我的底部UIImageView是一个人的照片。我的顶级UIImageView由2个坚实的分隔圆圈组成; 1个红色和1个绿色。使用滑块,如果我将红色像素的Alpha值从0.0更改为1.0,然后红色圆圈应淡入为纯红色,并且淡出完全平稳。

我可以通过将RGB数据数组值设置为等于alpha值并将alpha值设置为1.0来验证我的alpha值是否正常工作。这显示出一个黑色的圆圈逐渐消失在白色和背面。

下面是我用来创建第一张图像的代码。

//image <-- is the name of the second UIImageView that's passed to this method 
//rgbaDataNew <-- is the name of my pixel data array for the second image 

CGContextRef context; 
CGImageRef imageRef;  
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

context = CGBitmapContextCreate(rgbaDataNew, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
imageRef = CGBitmapContextCreateImage (context); 
UIImage * topImage = [UIImage imageWithCGImage:imageRef]; 

CGContextSetBlendMode(context, kCGBlendModeCopy); 
CGContextDrawImage(context, CGRectMake(0, 0, width, height), [topImage CGImage]); 

image.image = [UIImage imageWithCGImage:CGBitmapContextCreateImage (context)]; 

CGColorSpaceRelease(colorSpace);  
CGContextRelease(context); 
CGImageRelease(imageRef); 
+0

难道你不能只将一个图像视图放在另一个图像视图上,并将t opmost图像视图的'opaque'属性为'NO'? – jrturton 2012-07-15 06:13:09

+0

试过了,但没有改变结果。感谢您的回应! – 2012-07-15 06:19:52

回答

0

我会用稍微不同的方式来解决这个问题,但是它会涉及到少量的Quartz工作。

创建一个UIView子类并添加第一个imageView作为一个属性,还有一些其他值来定义你想要做什么与覆盖。

在子类的drawRect中,首先使用UIImageView的 - (void)drawInRect:(CGRect)rect方法绘制图像。

然后可以使用石英来笼络你到底怎么想的图像对象(使用,让你的框架,颜色,透明度等使用Quartz的示例代码,您可以很容易地找到视图的属性。

或者,如果你真的想使用第二个imageView,那么你可以在绘制底部视图后,使用第二个视图的 - (void)drawInRect:(CGRect)rect blendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha方法来覆盖它

在任何一种情况下,您都使用UIView子类。

+0

感谢您的回复。不幸的是,我没有绘制诸如实心红色圆圈等对象。我试图覆盖2个复杂的图像,并改变顶部图像中某些像素的alpha值,以允许显示较低图像的某些部分。那有意义吗?对不起,如果我误解你的回应。再次感谢! – 2012-07-15 23:23:24

+0

然后使用我提到的替代方法。你有两个UIImageViews。您设置框架,然后通过调用drawRect方法绘制第一个框架。然后你使用复杂的drawInRect方法 - 因此你可以改变它的混合模式和alpha。 – 2012-07-16 13:36:27