zoukankan      html  css  js  c++  java
  • 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;

    }

  • 相关阅读:
    Spring框架(二)
    Spring框架(一)
    SpringMVC中映射路径的用法之请求限制、命名空间
    关于映射路径@ReuqestMapping的总结
    关于什么是SpringMVC,和SpringMVC基于xml配置、注解配置、纯注解配置
    Spring Jdbc 框架整合的第一天
    Docker 搭建java+tomcat
    使用Docker安装mysql
    centos7.2 64位安装java
    Linux vim 基本操作
  • 原文地址:https://www.cnblogs.com/guanshenbao/p/5534652.html
Copyright © 2011-2022 走看看