iOS開發特殊日期灰色介面的實現
阿新 • 來源:網路 • 發佈:2021-02-15
文章搬運來源:https://www.jianshu.com/p/3db816b46edb
作者:左方
對iOS開發感興趣,可以看一下作者的iOS交流群:812157648,大家可以在裡面吹水、交流相關方面的知識,群裡還有我整理的有關於面試的一些資料,歡迎大家加群,大家一起開車
全國哀悼日期間App需要整體去彩色。採用如下方式實現。
先建立一個UIImageView的子類

用重寫setImage的方法修改。
- (void)setImage:(UIImage *)image
{
super.image = [self makeGrayImage:image];
}
在Xcode中查詢所有用到UIImageView的地方,替換成你所建立的子類。(查詢範圍記得別選上pods部分,免得修改過多)
這樣SDWebImage展示圖片的方法,也會走setImage。能把所有圖片都變灰。(button等可以以此類推)。
1.可用修改圖片飽和度的方法修改
- (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的過程就是圖片去色的過程。能完美展現圖片原本的樣子。
缺點:記憶體佔用比較大。
2.可用灰度處理的方法修改
- (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。
缺點:png的透明部分會變黑,(如果不對有透明部分的控制元件做操作,則沒問題)。
