iOS頁面灰化-節(jié)日

App頁面置灰,本質(zhì)是將彩色圖像轉(zhuǎn)換為灰度圖像,本文提供兩種方法實現(xiàn),一種是App整體置灰,一種是單個頁面置灰,可結(jié)合具體的業(yè)務(wù)場景使用。

方法一:分別將圖片和文字置灰

一般情況下,App頁面的顏色深度是24bit,也就是RGB各8bit;如果算上Alpha通道的話就是32bit,RGBA(或者ARGB)各8bit?;叶葓D像的顏色深度是8bit,這8bit表示的顏色不是彩色,而是256種不同亮度的黑色或白色。

說到灰度圖像,在YUV顏色空間上—其中Y代表亮度,調(diào)整Y值就可以得到不同的灰度圖像。

理論上,顏色空間RGB和YUV是等價的,同一種顏色用RGB或YUV都可以表示。從RGB數(shù)值對應(yīng)到亮度Y,一般采用公式Y(jié) = 0.299R+0.587G+0.114B,得到的結(jié)果再填充到RGB上就得到了對應(yīng)的灰度RGB顏色。

Y = 0.299R+0.587G+0.114B

Gray = RGB(Y,Y,Y)

1

2

以上是方法一App頁面置灰的原理基礎(chǔ)。

UIImage轉(zhuǎn)成灰度圖

核心是創(chuàng)建一個灰度空間,然后將圖像繪制到這個空間上

-(UIImage*)getGrayImage:(UIImage*)sourceImage

{

? int width = sourceImage.size.width;

? int height = sourceImage.size.height;

? // 創(chuàng)建灰度空間

? CGColorSpaceRef colorSpace =CGColorSpaceCreateDeviceGray();

? // 創(chuàng)建繪制上下文

? CGContextRef context =CGBitmapContextCreate(nil,width,height,8,0,colorSpace,kCGImageAlphaNone);

? CGColorSpaceRelease(colorSpace);

? if(context== NULL){

? ? ? return nil;

? }

? // 繪制原始圖像到新的上下文(灰度)

? CGContextDrawImage(context,CGRectMake(0,0, width, height), sourceImage.CGImage);

? // 獲取灰度圖像

? CGImageRef grayImageRef =CGBitmapContextCreateImage(context);

? // CGImage -> UIImage

? UIImage*grayImage=[UIImage imageWithCGImage:grayImageRef];

? //回收資源

? CGContextRelease(context);

? CGImageRelease(grayImageRef);

? return grayImage;

}


UIColor轉(zhuǎn)成灰度顏色

比較簡單了,使用公式就可以了Y = 0.299R+0.587G+0.114B

UIColor *color = xxxx;

CGFloat r,g,b,a;

[color getRed:&r green:&g> blue:&b alpha:&a];

CGFloat y = 0.299*r+0.587*g+0.114*b;

UIColor *gray = [UIColor colorWithRed:y green:y blue:y alpha:a]


方法二:給App整體添加灰色濾鏡

這個方法可以使App整體置灰,包括WebView頁面。

原理就是把App頁面當成一副圖像,使用另一副偏灰圖像和這個圖像進行疊加運算,從而得到新的圖像。

iOS 提供了Core Image 濾鏡,這些濾鏡可以設(shè)置在UIView.layer上。

我們要做的就是選取合適的濾鏡,并將濾鏡放置到App的最頂層

// 最頂層視圖,承載濾鏡,自身不接收、不攔截任何觸摸事件

@interface UIViewOverLay : UIView

@end

@implementation UIViewOverLay

-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event

{

? ? return nil;

}

@end

UIWindow *window = App的Window;

UIViewOverLay *overlay = [[UIViewOverLay alloc]initWithFrame:self.window.bounds];

overlay.translatesAutoresizingMaskIntoConstraints = false;

overlay.backgroundColor = [UIColor lightGrayColor];

overlay.layer.compositingFilter = @"saturationBlendMode";

[window addSubview:overlay];

最后通過各種方法,要保證overlay在最頂層.


上面使用的是UIView承載濾鏡,其實看代碼就知道了也可以直接使用CALayer來承載濾鏡(需要注意的是在UIWindow上直接添加CALayer時,在某些特殊的場景可能會造成繪制異常)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容