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

//** 颜色变化 */
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 图片的一些效果 代码片段)