iOS 除去图片的白色背景(接近白色),或者其它颜色的替换,获取像素点的ARGB值

iOS 除去图片的白色背景(接近白色),或者其它颜色的替换

方法如下:

//去除图片的白色背景

+ (UIImage*) imageToTransparent:(UIImage*) image

{

    // 分配内存

    const int imageWidth = image.size.width;

    const int imageHeight = image.size.height;

    size_t bytesPerRow = imageWidth * 4;

    uint32_t* rgbImageBuf = (uint32_t*)malloc(bytesPerRow * imageHeight);

    

    // 创建context

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    CGContextRef context = CGBitmapContextCreate(rgbImageBuf, imageWidth, imageHeight, 8, bytesPerRow, colorSpace,

                                                 kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);

    CGContextDrawImage(context, CGRectMake(0, 0, imageWidth, imageHeight), image.CGImage);

    

    // 遍历像素

    int pixelNum = imageWidth * imageHeight;

    uint32_t* pCurPtr = rgbImageBuf;

    for (int i = 0; i < pixelNum; i++, pCurPtr++)

    {

//        //去除白色...将0xFFFFFF00换成其它颜色也可以替换其他颜色。

//        if ((*pCurPtr & 0xFFFFFF00) >= 0xffffff00) {

//            

//            uint8_t* ptr = (uint8_t*)pCurPtr;

//            ptr[0] = 0;

//        }

        //接近白色

        //将像素点转成子节数组来表示---第一个表示透明度即ARGB这种表示方式。ptr[0]:透明度,ptr[1]:R,ptr[2]:G,ptr[3]:B

        //分别取出RGB值后。进行判断需不需要设成透明。

        uint8_t* ptr = (uint8_t*)pCurPtr;

        if (ptr[1] > 240 && ptr[2] > 240 && ptr[3] > 240) {

            //当RGB值都大于240则比较接近白色的都将透明度设为0.-----即接近白色的都设置为透明。某些白色背景具有杂质就会去不干净,用这个方法可以去干净

            ptr[0] = 0;

        }

    }

     // 将内存转成image

    CGDataProviderRef dataProvider =CGDataProviderCreateWithData(NULL, rgbImageBuf, bytesPerRow * imageHeight, nil);

    

    CGImageRef imageRef = CGImageCreate(imageWidth, imageHeight,8, 32, bytesPerRow, colorSpace,

                                        kCGImageAlphaLast |kCGBitmapByteOrder32Little, dataProvider,

                                        NULL, true,kCGRenderingIntentDefault);

    CGDataProviderRelease(dataProvider);

    UIImage* resultUIImage = [UIImage imageWithCGImage:imageRef];

    // 释放

    CGImageRelease(imageRef);

    CGContextRelease(context);

    CGColorSpaceRelease(colorSpace);

    return resultUIImage;

}

原文地址:https://www.cnblogs.com/guanshenbao/p/5534652.html