App頁面置灰粱锐,本質(zhì)是將彩色圖像轉(zhuǎn)換為灰度圖像樱蛤,本文提供兩種方法實(shí)現(xiàn)钮呀,一種是App整體置灰,一種是單個頁面置灰昨凡,可結(jié)合具體的業(yè)務(wù)場景使用行楞。
方法一:分別將圖片和文字置灰
一般情況下,App頁面的顏色深度是24bit土匀,也就是RGB各8bit;如果算上Alpha通道的話就是32bit形用,RGBA(或者ARGB)各8bit就轧。灰度圖像的顏色深度是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頁面當(dāng)成一副圖像憨降,使用另一副偏灰圖像和這個圖像進(jìn)行疊加運(yùn)算,從而得到新的圖像该酗。
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承載濾鏡,其實(shí)看代碼就知道了也可以直接使用CALayer來承載濾鏡(需要注意的是在UIWindow上直接添加CALayer時操骡,在某些特殊的場景可能會造成繪制異常)