17

我有一个具有部分透明度的单色图像。我有图像的正常和@2X 版本。我希望能够在代码中将图像着色为不同的颜色。下面的代码适用于普通图像,但 @2X 最终会出现伪影。正常图像可能有类似的问题如果是这样,由于分辨率的原因我无法检测到它。

+(UIImage *) newImageFromMaskImage:(UIImage *)mask inColor:(UIColor *) color {
    CGImageRef maskImage = mask.CGImage;
    CGFloat width = mask.size.width;
    CGFloat height = mask.size.height;
    CGRect bounds = CGRectMake(0,0,width,height);

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef bitmapContext = CGBitmapContextCreate(NULL, width, height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);
    CGContextClipToMask(bitmapContext, bounds, maskImage);
    CGContextSetFillColorWithColor(bitmapContext, color.CGColor);    
    CGContextFillRect(bitmapContext, bounds);

    CGImageRef mainViewContentBitmapContext = CGBitmapContextCreateImage(bitmapContext);
    CGContextRelease(bitmapContext);

    UIImage *result = [UIImage imageWithCGImage:mainViewContentBitmapContext];
    return result;
}

如果重要,则使用UIImage imageNamed:. 另外,我确认@2X 图像在视网膜模拟器上运行时正在加载。

更新:上面的代码有效。我看到的伪影是由图像消费者完成的额外转换引起的。这个问题可以被删除,因为它不再是一个真正的问题,或者留给后代。

4

2 回答 2

9

我已经更新了上面的代码以考虑视网膜分辨率图像:

- (UIImage *) changeColorForImage:(UIImage *)mask toColor:(UIColor*)color {

CGImageRef maskImage = mask.CGImage;
CGFloat width = mask.scale * mask.size.width;
CGFloat height = mask.scale * mask.size.height;
CGRect bounds = CGRectMake(0,0,width,height);

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bitmapContext = CGBitmapContextCreate(NULL, width, height, 8, 0, colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedLast);
CGContextClipToMask(bitmapContext, bounds, maskImage);
CGContextSetFillColorWithColor(bitmapContext, color.CGColor);    
CGContextFillRect(bitmapContext, bounds);

CGImageRef mainViewContentBitmapContext = CGBitmapContextCreateImage(bitmapContext);
CGContextRelease(bitmapContext);

return [UIImage imageWithCGImage:mainViewContentBitmapContext scale:mask.scale orientation:UIImageOrientationUp];
}
于 2013-12-23T20:03:23.887 回答
4

问题中的代码是工作代码。错误在别处。

于 2011-04-18T15:43:11.823 回答