1. 程式人生 >實用技巧 >其它 >iOS開發特殊日期灰色介面的實現

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


技術標籤:iOS程式設計開發程式碼規範灰色介面iOS開發

文章搬運來源:https://www.jianshu.com/p/3db816b46edb
作者:左方

對iOS開發感興趣,可以看一下作者的iOS交流群:812157648,大家可以在裡面吹水、交流相關方面的知識,群裡還有我整理的有關於面試的一些資料,歡迎大家加群,大家一起開車

全國哀悼日期間App需要整體去彩色。採用如下方式實現。
先建立一個UIImageView的子類

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

用重寫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的透明部分會變黑,(如果不對有透明部分的控制元件做操作,則沒問題)。