iOS图片反色原理及算法
2018-07-26 本文已影响253人
迷路的安然和无恙
在iOS的设置 辅助功能中,有一个反色的选项。
这个功能非常有意思,但是在反色模式下,当我截屏的时候,并没有将反色后的图片截取到,之后我就写了以下的一段代码,实现真正的反色功能。Demo地址效果如下:
IMG_1559.PNG反色原理
一个RGB
的颜色值,如RGB(0.2, 0.1, 0.5)
,它的反色是RGB(0.8, 0.9, 0.5)
。反色是与原色叠加可以变为白色的颜色,即用白色RGB:(1.0,1.0,1.0)
减去原色的颜色。比如说红色RGB:1.0,0,0
的反色是青色(0,1.0,1.0)
。在OPENGL ES
中为1。
算法代码如下
// ColorInver
- (UIImage *)inverColorImage:(UIImage *)image {
CGImageRef cgimage = image.CGImage;
size_t width = CGImageGetWidth(cgimage);
size_t height = CGImageGetHeight(cgimage);
// 取图片首地址
unsigned char *data = calloc(width * height * 4, sizeof(unsigned char));
size_t bitsPerComponent = 8; // r g b a 每个component bits数目
size_t bytesPerRow = width * 4; // 一张图片每行字节数目 (每个像素点包含r g b a 四个字节)
// 创建rgb颜色空间
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(data, width, height, bitsPerComponent, bytesPerRow, space, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), cgimage);
for (size_t i = 0; i < height; i++) {
for (size_t j = 0; j < width; j++) {
size_t pixelIndex = i * width * 4 + j * 4;
unsigned char red = data[pixelIndex];
unsigned char green = data[pixelIndex + 1];
unsigned char blue = data[pixelIndex + 2];
// 修改颜色
data[pixelIndex] = 255 - red;
data[pixelIndex + 1] = 255 - green;
data[pixelIndex + 2] = 255 - blue;
}
}
cgimage = CGBitmapContextCreateImage(context);
return [UIImage imageWithCGImage:cgimage];
}