UIImge去掉黑色背景-----

来源:互联网 发布:淘宝保证金能全部退吗 编辑:程序博客网 时间:2024/05/03 04:12


今天在做图像叠加的时候,由于给我的图片有黑色背景,想去背景叠加,这里是我找到的代码,记录一下,以后说不定还能用到。

- (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);        // 创建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++)    {        if ((*pCurPtr & 0xFFFFFF00) == 0)    // 将黑色变成透明        {            uint8_t* ptr = (uint8_t*)pCurPtr;            ptr[0] = 0;        }                // 改成下面的代码,会将图片转成灰度        /*uint8_t* ptr = (uint8_t*)pCurPtr;         // gray = red * 0.11 + green * 0.59 + blue * 0.30         uint8_t gray = ptr[3] * 0.11 + ptr[2] * 0.59 + ptr[1] * 0.30;         ptr[3] = gray;         ptr[2] = gray;         ptr[1] = gray;*/    }        // 将内存转成image    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);    // free(rgbImageBuf) 创建dataProvider时已提供释放函数,这里不用free        return resultUIImage;}void ProviderReleaseData (void *info, const void *data, size_t size){    free((void*)data);}

这里必须是单色,不然去除后会有噪点,不能去除干净。

0 0