Мне нужно определить, является ли изображение полутоновой (содержит только черный, белый или оттенки серого) или содержит любой цвет.Как определить изображение в оттенках серого
Какие библиотеки я должен использовать для этого?
Мне нужно определить, является ли изображение полутоновой (содержит только черный, белый или оттенки серого) или содержит любой цвет.Как определить изображение в оттенках серого
Какие библиотеки я должен использовать для этого?
Вот @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;}
}
Концепция оттенков серого заключается в том, что для пикселя с красными, зелеными и синими значениями, если Amount of Red = Amount of Green = Amount of Blue
, то у вас есть пиксель с оттенками серого. Если все пиксели вашего изображения находятся под этим условием, это означает, что вы имеете растровое изображение в градациях серого.
Итак, все, что вам нужно сделать, - это перебрать значения RGB вашего растрового изображения. На iOS вы можете получить доступ к пикселям изображения, используя приведенный ниже код.
CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
const UInt8 * data = CFDataGetBytePtr(pixelData);
Это предполагает оттенки серого в модели RGB. Существует также модель в оттенках серого, в которой этот способ не удастся. – borrrden
Да, как я уже сказал, концепция, стоящая за оттенками серого, заключается в том, что «для пикселя с красными, зелеными и синими значениями», для других моделей это другое ... предположим, что здесь он работает с растровым (iOS), поэтому RGB-моделью. ..но я не знал о глубоких подробностях, которые вы предлагали о CGColorSpaceGetNumberOfComponents! ;-) –
Эта информация содержится в любом 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.
Woudn't CGColorSpaceGetNumberOfComponents возвращает 4 даже структурированных изображений RGBA? И вы уверены, что K должен иметь то же значение, что и C M и Y для CYMK? Достаточно ли, когда C, M и Y будут равны друг другу? –
@HermannKlecker iOS не считается альфой как «цветной», он обрабатывает его отдельно. Вы правы насчет CMYK. У меня нет большого опыта в этом, поэтому я просто поспешно бросил его туда. Я передумаю. – borrrden
зачем вам это нужно? Что ты пытаешься сделать? –
Например, ImageMagick. Или сделай это сам. Ваш вопрос не заполнен: что вы хотите сделать? –
@Srikar Appal Мне нужно рассчитать стоимость печати – TUNER88