美文网首页iOS开发
iOS图片反色原理及算法

iOS图片反色原理及算法

作者: 迷路的安然和无恙 | 来源:发表于2018-07-26 15:48 被阅读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];
    }
    

    相关文章

      网友评论

        本文标题:iOS图片反色原理及算法

        本文链接:https://www.haomeiwen.com/subject/ocybmftx.html