• 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;

    }

  • 相关阅读:
    grape入门
    半个小时写的一个二叉搜索树,实现了增,删,查功能
    Struts2 MVC 同 Spring MVC 的比较
    阿里巴巴 2016 java 实习岗位笔试题(昨天出炉)
    自己用20分钟java实现的单向链表(含有增删改查操作)
    关于 古人劝学 --写的真心是好 真的有收获
    JDK动态代理堆栈图详解--干货
    论闷声挣大钱与网红现象
    spring beanfactory --实现自己简单的 bean工厂类
    Spring IOC example one
  • 原文地址:https://www.cnblogs.com/guanshenbao/p/5534652.html
Copyright © 2020-2023  润新知