簡體   English   中英

UIImage混合模式問題

[英]UIImage Blend Mode Problems

我正在嘗試覆蓋2張圖片。 底部圖像從圖像庫加載到Alpha設置為1.0的UIImageView對象中。 該圖像中的所有像素的alpha值也為1.0。 我在上下文中創建的第二個圖像。 該圖像的Alpha值因像素而異。 在上下文中創建第二個圖像之后,我將其繪制到顯示在第一個UIImageView頂部的第二個UIImageView中。 此第二UIImageView的Alpha設置為1.0。 兩個UIImageViews的background屬性都設置為clear。

我試圖在運行時使用滑塊更改第二個圖像中像素的各個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);

我會以稍有不同的方式來解決這個問題,但這將涉及少量的Quartz工作。

創建一個UIView子類,並將第一個imageView作為屬性添加,並添加一些其他值來定義您要對疊加層進行的操作。

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

然后,您可以使用石英在圖像上完全按照所需的方式繪制對象(使用提供框架,顏色,不透明度等的視圖屬性。您可以使用Quartz輕松找到示例代碼。

或者,如果您確實要使用第二個imageView,則可以在繪制底視圖之后,使用第二個視圖的-(void)drawInRect:(CGRect)rect blendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha方法覆蓋它。

無論哪種情況,都可以使用UIView子類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM