检测图像上的大多数黑色像素 - objective-c iOS

时间:2012-01-21 02:53:31

标签: objective-c ios image colors pixel

我有一张照片!我已经做了像素检测已经很久了,我记得你必须以某种方式将像素转换为数组,然后找到图像的宽度以找出像素到达行尾的时间并转到下一行和啊,很多复杂的东西哈哈!无论如何我现在已经不知道如何做到这一点但是我需要检测最左边最黑暗像素的x& y坐标,我的图像名为“image1”......有什么好的起点吗?

1 个答案:

答案 0 :(得分:2)

去你的书店,找到Erica Sadun的一本名为“iOS Developer's Cookbook”的书。转到第378页,其中有像素检测方法。您可以查看这个RGB值数组并运行for循环来排序并找到具有最小R,G和B值之和的像素(这将是0-255),它将为您提供最接近黑色的像素。 如果需要,我也可以发布代码。但这本书是最好的来源,因为它提供了方法和解释。

这些是我的一些变化。方法名称保持不变。我改变的只是图像,它基本上来自图像选择器。

-(UInt8 *) createBitmap{
if (!self.imageCaptured) {
        NSLog(@"Error: There has not been an image captured.");
        return nil;
    }
    //create bitmap for the image
    UIImage *myImage = self.imageCaptured;//image name for test pic
    CGContextRef context = CreateARGBBitmapContext(myImage.size);
    if(context == NULL) return NULL;
    CGRect rect = CGRectMake(0.0f/*start width*/, 0.0f/*start*/, myImage.size.width /*width bound*/, myImage.size.height /*height bound*/); //original
//    CGRect rect = CGRectMake(myImage.size.width/2.0 - 25.0 /*start width*/, myImage.size.height/2.0 - 25.0 /*start*/, myImage.size.width/2.0 + 24.0 /*width bound*/, myImage.size.height/2.0 + 24.0 /*height bound*/); //test rectangle

    CGContextDrawImage(context, rect, myImage.CGImage);
    UInt8 *data = CGBitmapContextGetData(context);
    CGContextRelease(context);    
    return data;
}
CGContextRef CreateARGBBitmapContext (CGSize size){

    //Create new color space
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    if (colorSpace == NULL) {
        fprintf(stderr, "Error allocating color space\n");
        return NULL;
    }
    //Allocate memory for bitmap data
    void *bitmapData = malloc(size.width*size.height*4);
    if(bitmapData == NULL){
        fprintf(stderr, "Error: memory not allocated\n");
        CGColorSpaceRelease(colorSpace);
        return NULL;
    }
    //Build an 8-bit per channel context
    CGContextRef context = CGBitmapContextCreate(bitmapData, size.width, size.height, 8, size.width*4, colorSpace, kCGImageAlphaPremultipliedFirst);
    CGColorSpaceRelease(colorSpace);
    if (context == NULL) {
        fprintf(stderr, "Error: Context not created!");
        free(bitmapData);
        return NULL;
    }
    return context;

}
NSUInteger blueOffset(NSUInteger x, NSUInteger y, NSUInteger w){
    return y*w*4 + (x*4+3);
}
NSUInteger redOffset(NSUInteger x, NSUInteger y, NSUInteger w){
    return y*w*4 + (x*4+1);
}

底部的方法redOffset将为您提供ARGB(Alpha-Red-Green-Blue)比例的红色值。要更改您正在查看的ARGB中的哪个频道,请将redOffset函数中添加到x变量的值更改为0以查找alpha,将其保持为1以查找红色,将其保持为2以查找绿色,将3更改为蓝色。这是有效的,因为它只是查看上面方法中的数组,并添加x帐户的索引值。基本上,使用三种颜色(红色,绿色和蓝色)的方法,并找到每个像素的总和。无论哪个像素具有最低的红色,绿色和蓝色值,都是最黑的。