我有一个UIImage,我想减少每个点的rgb值,我该怎么做? 或者如何在图像中将一种颜色更改为另一种颜色? [Xcode8,swift3]
答案 0 :(得分:0)
其中一种方法是使用图像作为模板并设置所需的颜色。
extension UIImageView {
func changeImageColor( color:UIColor) -> UIImage
{
image = image!.withRenderingMode(.alwaysTemplate)
tintColor = color
return image!
}
}
//Change color of logo
logoImage.image = logoImage.changeImageColor(color: .red)
答案 1 :(得分:0)
此答案仅适用于您想要更改单个像素的情况。
首先使用UIImage.cgImage
获取CGImage
。接下来,使用CGBitmapContextCreate
创建一个位图上下文,其中包含CGColorSpaceCreateDeviceRGB
颜色空间和您想要的任何混合模式。
然后调用CGContextDrawImage
将图像绘制到由您提供的像素阵列支持的上下文。清理,你现在有一个像素数组。
- (uint8_t*)getPixels:(UIImage *)image {
CGColorSpaceRef cs= CGColorSpaceCreateDeviceRGB();
uint8_t *pixels= malloc(image.size.width * image.size.height * 4);
CGContextRef ctx= CGBitmapContextCreate(rawData, image.size.width, image.size.height, 8, image.size.width * 4, cs, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(cs);
CGContextDrawImage(ctx, CGRectMake(0, 0, image.size.width, image.size.height));
CGContextRelease(ctx);
return pixels;
}
根据需要修改像素。然后从像素中重新创建图像..
- (UIImage *)imageFromPixels:(uint8_t *)pixels width:(NSUInteger)width height:(NSUInteger)height {
CGDataProviderRef provider = CGDataProviderCreateWithData(nil, pixels, width * height * 4, nil);
CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB();
CGImageRef cgImageRef = CGImageCreate(width, height, 8, 32, width * 4, cs, kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast, provider, nil, NO, kCGRenderingIntentDefault);
pixels = malloc(width * height * 4);
CGContextRef ctx = CGBitmapContextCreate(pixels, width, height, 8, width * 4, cs, kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast);
CGContextDrawImage(ctx, (CGRect) { .origin.x = 0, .origin.y = 0, .size.width = width, .size.height = height }, cgImage);
CGImageRef cgImage = CGBitmapContextCreateImage(ctx);
UIImage *image = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
CGContextRelease(ctx);
CGColorSpaceRelease(cs);
CGImageRelease(cgImageRef);
CGDataProviderRelease(provider);
free(pixels);
return image;
}