按颜色分割UIImage并创建2个图像

时间:2011-01-21 20:51:39

标签: iphone objective-c

我已经通过替换图像中的颜色,但无法让它按照我需要的方式工作,因为我尝试使用除了一种颜色以外的每种颜色以及透明度。

我正在寻找的是一种拍摄图像并从该图像中分离出一种颜色(比如所有纯黑色)的方法。然后取出拆分部分,制作一个带有透明背景和拆分部分的新图像。

(这里只是这个想法的一个例子,说我想拍这个页面的截图。制作其他颜色但纯黑色是透明的,并将新图像保存到库中,或者将其放入UIImageView)

我已经查看了CGImageCreateWithMaskingColors,但似乎无法用透明部分做我需要的东西,我真的不明白colorMasking输入,除了你可以提供{Rmin,Rmax,Gmin,Gmax,Bmin,Bmax颜色面具但是当我这样做时,它会为一切颜色着色。任何想法或意见都会很棒。

1 个答案:

答案 0 :(得分:2)

听起来你将不得不访问底层字节并编写代码来直接处理它们。您可以使用CGImageGetDataProvider()来访问图像的数据,但不能保证格式是您知道如何处理的。或者,您可以使用您知道如何处理的特定格式创建新的CGContextRef,然后将原始图像绘制到新的上下文中,然后处理基础数据。这是一个快速尝试做你想要的(未编译):

- (UIImage *)imageWithBlackPixels:(UIImage *)image {
    CGImageRef cgImage = image.CGImage;
    // create a premultiplied ARGB context with 32bpp
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
    size_t width = CGImageGetWidth(cgImage);
    size_t height = CGImageGetHeight(cgImage);
    size_t bpc = 8; // bits per component
    size_t bpp = bpc * 4 / 8; // bytes per pixel
    size_t bytesPerRow = bpp * width;
    void *data = malloc(bytesPerRow * height);
    CGBitmapInfo bitmapInfo = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host;
    CGContextRef ctx = CGBitmapContextCreate(data, width, height, bpc, bytesPerRow, colorspace, bitmapInfo);
    CGColorSpaceRelease(colorspace);
    if (ctx == NULL) {
        // couldn't create the context - double-check the parameters?
        free(data);
        return nil;
    }
    // draw the image into the context
    CGContextDrawImage(ctx, CGRectMake(0, 0, width, height), cgImage);
    // replace all non-black pixels with transparent
    // preserve existing transparency on black pixels
    for (size_t y = 0; y < height; y++) {
        size_t rowStart = bytesPerRow * y;
        for (size_t x = 0; x < width; x++) {
            size_t pixelOffset = rowStart + x*bpp;
            // check the RGB components of the pixel
            if (data[pixelOffset+1] != 0 || data[pixelOffset+2] != 0 || data[pixelOffset+3] != 0) {
                // this pixel contains non-black. zero it out
                memset(&data[pixelOffset], 0, 4);
            }
        }
    }
    // create our new image and release the context data
    CGImageRef newCGImage = CGBitmapContextCreateImage(ctx);
    CGContextRelease(ctx);
    free(data);
    UIImage *newImage = [UIImage imageWithCGImage:newCGImage scale:image.scale orientation:image.imageOrientation];
    CGImageRelease(newCGImage);
    return newImage;
}