Обнаружить самый черный пиксель на изображении - PullRequest
0 голосов
/ 21 января 2012

У меня есть изображение!Прошло так много времени с тех пор, как я обнаружил пиксели, я помню, что вам нужно как-то преобразовать пиксели в массив, а затем найти ширину изображения, чтобы определить, когда пиксели достигают конца строки и переходят к следующейи ааа, много сложных вещей, ха-ха!В любом случае, теперь я понятия не имею, как это сделать, но мне нужно определить координаты x и y самого левого самого темного пикселя моего изображения с именем "image1" ... Есть ли хорошие стартовые места?

1 Ответ

2 голосов
/ 21 января 2012

Зайдите в свой книжный магазин и найдите книгу под названием «Поваренная книга разработчика iOS» Эрики Садун. Перейдите на страницу 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 даст вам значение Red в шкале ARGB (Alpha-Red-Green-Blue). Чтобы изменить канал в ARGB, который вы просматриваете, измените значение, добавленное к переменной x в функции redOffset, на 0, чтобы найти альфа, оставьте его равным 1, чтобы найти красный, 2, чтобы найти зеленый, и 3, чтобы найти синий. Это работает, потому что он просто смотрит на массив, созданный в описанных выше методах, и добавление к x учитывает значение индекса. По сути, используйте методы для трех цветов (красный, зеленый и синий) и найдите сумму для каждого пикселя. Какой бы пиксель не имел значения красного, зеленого и синего вместе, он будет самым черным.

...