美文网首页
ios 图片的一些效果 代码片段

ios 图片的一些效果 代码片段

作者: 那个人一定不是我 | 来源:发表于2017-09-19 11:38 被阅读0次
    //** 颜色变化 */
    void ProviderReleaseData (void *info, const void *data, size_t size){
        free((void*)data);
    }
    
    
    - (UIImage*)imageBlackToTransparent:(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);
        
        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++){
            
            /*
             灰度处理一般有三种算法:
             1 最大值法:即新的颜色值R=G=B=Max(R,G,B),这种方法处理后的图片看起来亮度值偏高。
             2 平均值法:即新的颜色值R=G=B=(R+G+B)/3,这样处理的图片十分柔和
             3 加权平均值法:即新的颜色值R=G=B=(R * Wr+G*Wg+B*Wb),一般由于人眼对不同颜色的敏感度不一样,所以三种颜色值的权重不一样,
                一般来说绿色最高,红色其次,蓝色最低,最合理的取值分别为Wr = 30%,Wg = 59%,Wb = 11%
             */
            /*
             底片效果
             算法原理:将当前像素点的RGB值分别与255之差后的值作为当前点的RGB值,即
             R = 255 – R;G = 255 – G;B = 255 – B;
             */
            /*
             浮雕效果
             浮雕的算法相对复杂一些,用当前点的RGB值减去相邻点的RGB值并加上128作为新的RGB值。由于图片中相邻点的颜色值是比较接近的,
             因此这样的算法处理之后,只有颜色的边沿区域,也就是相邻颜色差异较大的部分的结果才会比较明显,而其他平滑区域则值都接近128左右,也就是灰色,
             这样就具有了浮雕效果。
             
             在实际的效果中,这样处理后,有些区域可能还是会有”彩色”的一些点或者条状痕迹,所以最好再对新的RGB值做一个灰度处理。
             */
            /* ptr[0] 为alpha通道
             黑白算法: R G B值求平均值,大于120的为黑色,小于为白色
             */
            
            uint8_t* ptr = (uint8_t*)pCurPtr;
            
            int avg = (ptr[3] + ptr[2] + ptr[1]) / 3;
            
            if (avg >= 120) { //120为经验值,可以修改
                
                ptr[3] = 255;
                ptr[2] = 255;
                ptr[1] = 255;
                
            }else{
            
                ptr[3] = 0;
                ptr[2] = 0;
                ptr[1] = 0;
            }
            
        }
        
        // 输出图片
        CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, rgbImageBuf, bytesPerRow * imageHeight, ProviderReleaseData);
        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;
    }
    
    

    参考 http://www.icodelogic.com/?p=575

    相关文章

      网友评论

          本文标题:ios 图片的一些效果 代码片段

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