文章搬運來源:www.jianshu.com/p/3db816b46…面試
做者:左方markdown
對iOS開發感興趣,能夠看一下做者的iOS交流羣:812157648,你們能夠在裏面吹水、交流相關方面的知識,羣裏還有我整理的有關於面試的一些資料,歡迎你們加羣,你們一塊兒開車oop
全國哀悼日期間App須要總體去彩色。採用以下方式實現。 先創建一個UIImageView的子類測試
用重寫setImage的方法修改。spa
- (void)setImage:(UIImage *)image
{
super.image = [self makeGrayImage:image];
}
複製代碼
在Xcode中查找全部用到UIImageView的地方,替換成你所創建的子類。(查找範圍記得別選上pods部分,省得修改過多) 這樣SDWebImage展現圖片的方法,也會走setImage。能把全部圖片都變灰。(button等能夠以此類推)。3d
- (UIImage*)makeGrayImage:(UIImage*)image {
//修改飽和度爲0
CIImage *beginImage = [CIImage imageWithCGImage:image.CGImage];
CIFilter * filter = [CIFilter filterWithName:@"CIColorControls"];
[filter setValue:beginImage forKey:kCIInputImageKey];
//飽和度 0---2 默認爲1
[filter setValue:0 forKey:@"inputSaturation"];
// 獲得過濾後的圖片
CIImage *outputImage = [filter outputImage];
// 轉換圖片, 建立基於GPU的CIContext對象
CIContext *context = [CIContext contextWithOptions: nil];
CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *newImg = [UIImage imageWithCGImage:cgimg];
// 釋放C對象
CGImageRelease(cgimg);
return newImg;
}
複製代碼
優勢:飽和度爲0的過程就是圖片去色的過程。能完美展示圖片本來的樣子。 缺點:內存佔用比較大。code
- (UIImage*)systemImageToGrayImage:(UIImage*)image{
int width = image.size.width;
int height = image.size.height;
//第一步:建立顏色空間(說白了就是 開闢一塊顏色內存空間)
//圖片灰度處理(建立灰度空間)
CGColorSpaceRef colorRef = CGColorSpaceCreateDeviceGray();
//第二步:顏色空間的上下文(保存圖像數據信息)
//參數1:內存大小(指向這塊內存區域的地址)(內存地址)
//參數2:圖片寬
//參數3:圖片高
//參數4:像素位數(顏色空間,例如:32位像素格式和RGB顏色空間,8位)
//參數5:圖片每一行佔用的內存比特數
//參數6:顏色空間
//參數7:圖片是否包含A通道(ARGB通道)
CGContextRef context = CGBitmapContextCreate(nil, width, height, 8, 0, colorRef, kCGImageAlphaNone);
//釋放內存
CGColorSpaceRelease(colorRef);
if (context == nil) {
return nil;
}
//第三步:渲染圖片(繪製圖片)
//參數1:上下文
//參數2:渲染區域
//參數3:源文件(原圖片)(說白了如今是一個C/C++的內存區域)
CGContextDrawImage(context, CGRectMake(0, 0, width, height), image.CGImage);
//第四步:將繪製顏色空間轉成CGImage(轉成可識別圖片類型)
CGImageRef grayImageRef = CGBitmapContextCreateImage(context);
//第五步:將C/C++ 的圖片CGImage轉成面向對象的UIImage(轉成iOS程序認識的圖片類型)
UIImage* dstImage = [UIImage imageWithCGImage:grayImageRef];
//釋放內存
CGContextRelease(context);
CGImageRelease(grayImageRef);
return dstImage;
}
複製代碼
優勢:通過幾回測試,內存佔用比修改飽和度方法低5-10mb。orm
缺點:png的透明部分會變黑,(若是不對有透明部分的控件作操做,則沒問題)。對象