iOS開發特殊日期灰色界面的實現

文章搬運來源: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

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的過程就是圖片去色的過程。能完美展示圖片本來的樣子。 缺點:內存佔用比較大。code

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。orm

缺點:png的透明部分會變黑,(若是不對有透明部分的控件作操做,則沒問題)。對象

相關文章
相關標籤/搜索