2012-07-15 126 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