Зайдите в свой книжный магазин и найдите книгу под названием «Поваренная книга разработчика 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 учитывает значение индекса. По сути, используйте методы для трех цветов (красный, зеленый и синий) и найдите сумму для каждого пикселя. Какой бы пиксель не имел значения красного, зеленого и синего вместе, он будет самым черным.