8

単色に近いイメージがあります。付いていますが、白無地なので目立ちません。

サンプル画像 実行時にこの画像を動的に色付けできるようにしたいのですが、UIImageRenderingModeAlwaysTemplate を使用せずに iOS 6 で行う必要があります。

画像はすべて無地の白で始まり、角を丸くするための小さなグラデーションが適用されます。

これまでのところ、私の最善の試みは GPUImage と UIImage のカテゴリを使用することでした

@implementation UIImage (BPAdditions)

- (UIImage *)imageWithColor:(UIColor *)color
{

    GPUImageRGBFilter *stillImageFilter = [[GPUImageRGBFilter alloc] init];
    CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha =0.0;
    [color getRed:&red green:&green blue:&blue alpha:&alpha];
    stillImageFilter.red = red;
    stillImageFilter.green = green;
    stillImageFilter.blue = blue;
    GPUImageChromaKeyFilter *stillImageFilter2 = [[GPUImageChromaKeyFilter alloc] init];
    [stillImageFilter2 setColorToReplaceRed:0 green:0 blue:0];
    stillImageFilter2.thresholdSensitivity = 0.2;
    stillImageFilter2.smoothing = 0;
    UIImage *img = [stillImageFilter imageByFilteringImage:self];

    return [stillImageFilter2 imageByFilteringImage: img];
}

これは理想的ですが、RGB フィルターを使用すると、クリアな背景が黒くなります。これをクロマフィルターで除去すると、使用する色によって品質が異なります。

ターゲット カラーが黒になる可能性があります。その場合、このソリューションは完全に失敗します。

4

1 に答える 1

18

あなたが達成しようとしていることを理解しているかどうかわかりませんが、基本画像に単純な色合いを追加しますか? その場合、UIImage の次のカテゴリでこれを実現できます。

- (UIImage *)tintWithColor:(UIColor *)tintColor {
    UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]);
    CGRect drawRect = CGRectMake(0, 0, self.size.width, self.size.height);
    [self drawInRect:drawRect];
    [tintColor set];
    UIRectFillUsingBlendMode(drawRect, kCGBlendModeSourceAtop);
    UIImage *tintedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return tintedImage;
}

-- 更新: Swift 2 バージョン --

extension UIImage {

    func tintWithColor(color:UIColor) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(self.size, false, UIScreen.mainScreen().scale)

        let rect = CGRectMake(0, 0, self.size.width, self.size.height)
        self.drawInRect(rect)
        color.setFill()
        UIRectFillUsingBlendMode(rect, CGBlendMode.SourceAtop)

        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage
    }

}
于 2013-09-18T13:06:06.913 に答える