2013-05-27 3 views
2

Мне нужно определить, является ли изображение полутоновой (содержит только черный, белый или оттенки серого) или содержит любой цвет.Как определить изображение в оттенках серого

Какие библиотеки я должен использовать для этого?

+1

зачем вам это нужно? Что ты пытаешься сделать? –

+1

Например, ImageMagick. Или сделай это сам. Ваш вопрос не заполнен: что вы хотите сделать? –

+0

@Srikar Appal Мне нужно рассчитать стоимость печати – TUNER88

ответ

2

Вот @borrrden ответ в коде:

- (BOOL)isGrayScale{ 
    CGImageRef imageRef = [self CGImage]; 
    CGColorSpaceRef colorSpace = CGImageGetColorSpace(imageRef); 
    if (CGColorSpaceGetModel(colorSpace) == kCGColorSpaceModelRGB) { 
     CGDataProviderRef dataProvider = CGImageGetDataProvider(imageRef); 
     CFDataRef imageData = CGDataProviderCopyData(dataProvider); 
     const UInt8 *rawData = CFDataGetBytePtr(imageData); 

     size_t width = CGImageGetWidth(imageRef); 
     size_t height = CGImageGetHeight(imageRef); 

     int byteIndex = 0; 
     BOOL allPixelsGrayScale = YES; 
     for(int ii = 0 ; ii <width*height; ++ii) 
     { 
      int r = rawData[byteIndex]; 
      int g = rawData[byteIndex+1]; 
      int b = rawData[byteIndex+2]; 
      if (!((r == g)&&(g == b))) { 
       allPixelsGrayScale = NO; 
       break; 
      } 
      byteIndex += 4; 
     } 
     CFRelease(imageData); 
     CGColorSpaceRelease(colorSpace); 
     return allPixelsGrayScale; 
    } 
    else if (CGColorSpaceGetModel(colorSpace) == kCGColorSpaceModelMonochrome){ 
     CGColorSpaceRelease(colorSpace); return YES;} 
    else {CGColorSpaceRelease(colorSpace); return NO;} 
} 
2

Концепция оттенков серого заключается в том, что для пикселя с красными, зелеными и синими значениями, если Amount of Red = Amount of Green = Amount of Blue, то у вас есть пиксель с оттенками серого. Если все пиксели вашего изображения находятся под этим условием, это означает, что вы имеете растровое изображение в градациях серого.

Итак, все, что вам нужно сделать, - это перебрать значения RGB вашего растрового изображения. На iOS вы можете получить доступ к пикселям изображения, используя приведенный ниже код.

CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage)); 
const UInt8 * data = CFDataGetBytePtr(pixelData); 
+1

Это предполагает оттенки серого в модели RGB. Существует также модель в оттенках серого, в которой этот способ не удастся. – borrrden

+0

Да, как я уже сказал, концепция, стоящая за оттенками серого, заключается в том, что «для пикселя с красными, зелеными и синими значениями», для других моделей это другое ... предположим, что здесь он работает с растровым (iOS), поэтому RGB-моделью. ..но я не знал о глубоких подробностях, которые вы предлагали о CGColorSpaceGetNumberOfComponents! ;-) –

11

Эта информация содержится в любом CGImageRef объекте. Вы можете получить этот объект из любого UIImage. В частности, то, что вас заинтересует, - CGImageGetColorSpace. После этого вы можете позвонить CGColorSpaceGetNumberOfComponents в цветовом пространстве. Там должно быть только три возможности.

CGColorSpaceGetNumberOfComponents возвращает 1: Это изображение полутоновой, завершено (одно исключение: оно может быть только альфа-версией, но я сомневаюсь, что вы будете отправлять какие-либо изображения, подобные этому. способ, чтобы определить, является ли изображение является альфа только через его CGAlphaInfo)

CGColorSpaceGetNumberOfComponents возвращается 3: Это изображение RGB, и необходим дальнейший анализ, чтобы определить, является ли это черно-белый или нет (как и другие государства ответа, петля над пиксели, и если вы найдете там где! (R == G == B), то это не оттенки серого.

CGColorSpaceGetNumberOfComponents возвращает 4: Это изображение CMYK, и необходим дальнейший анализ. Все оттенки серого в CMYK должны быть C == M == Y (обычно они будут равны 0, так как все остальное будет пустой тратой чернил [этот формат был разработан специально с учетом принтеров]) с K, равным любому значению.

CGColorSpaceGetNumberOfComponents возвращает что-то другое: ... ну ... плачь

UPDATE

Как было отмечено в комментариях, есть более удобная функция для выяснения модели цвета. CGColorSpaceGetModel вернет такие значения, как kCGColorSpaceModelMonochrome или kCGColorSpaceModelRGB. Из этого выйдет двусмысленность. После этого вы можете проверить один и тот же путь для RGB или CMYK.

+0

Woudn't CGColorSpaceGetNumberOfComponents возвращает 4 даже структурированных изображений RGBA? И вы уверены, что K должен иметь то же значение, что и C M и Y для CYMK? Достаточно ли, когда C, M и Y будут равны друг другу? –

+0

@HermannKlecker iOS не считается альфой как «цветной», он обрабатывает его отдельно. Вы правы насчет CMYK. У меня нет большого опыта в этом, поэтому я просто поспешно бросил его туда. Я передумаю. – borrrden

Смежные вопросы