美文网首页
iOS开发 图片转黑白

iOS开发 图片转黑白

作者: 喜剧收尾_XWX | 来源:发表于2020-04-16 00:17 被阅读0次

灰度公式

对于彩色转灰度,有一个很著名的心理学公式

 Gray = R*0.299 + G*0.587 + B*0.114

oc转换方法

- (UIImage*)imageToGray{

    
    CGImageRef imageRef = [self CGImage];

    size_t width = CGImageGetWidth(imageRef);
    size_t height = CGImageGetHeight(imageRef);

    size_t bitsPerComponent = 8;
    size_t bytesPerRow = width * 4;

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    uint32_t *pixels = (uint32_t *) calloc(bytesPerRow * height, sizeof(uint8_t));

    // kCGImageAlphaPremultipliedFirst      ARGB
    // kCGImageAlphaPremultipliedLast       RGBA

    // kCGBitmapByteOrder32Little   小端 (低位字节在前)
    // kCGBitmapByteOrder32Big      大端 (高位字节在前)
    CGContextRef context = CGBitmapContextCreate(pixels, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

    CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);

    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            uint8_t *rgbaPixel = (uint8_t *) &pixels[y * width + x];
            
            //RGB

          //  uint32_t gray = 0.3 * rgbaPixel[0] + 0.59 * rgbaPixel[1] + 0.11 * rgbaPixel[2];
            
            uint32_t  gray = (rgbaPixel[0]*19595 + rgbaPixel[1]*38469 + rgbaPixel[2]*7472) >> 16;

            rgbaPixel[0] = gray;
            rgbaPixel[1] = gray;
            rgbaPixel[2] = gray;
        }
    }

    CGImageRef newImageRef = CGBitmapContextCreateImage(context);

    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);
    free(pixels);

    UIImage *resultImage = [UIImage imageWithCGImage:newImageRef];

    CGImageRelease(newImageRef);

    return resultImage;
    
    
    

}

相关文章

网友评论

      本文标题:iOS开发 图片转黑白

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