2013-05-27 59 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:該圖像是灰度,完成(有一個例外:它可能是alpha-only,但我懷疑你會發送像這樣的任何圖像。一種方法來確定是否圖像是α-僅通過其CGAlphaInfo

CGColorSpaceGetNumberOfComponents返回3:該圖像是RGB,並且需要進一步的分析,以確定它是否是灰度或不(作爲對方的回答狀態,循環通過像素,如果你找到一個地方!(R == G == B),那麼它不是灰度。

CGColorSpaceGetNumberOfComponents返回4:此圖像是CMYK,並且需要進一步分析。 CMYK中的所有灰度應該是C == M == Y(通常它們將是0,否則任何東西都會浪費墨水(這種格式是專門爲打印機設計的),K等於任何值。

CGColorSpaceGetNumberOfComponents回報別的東西:......好哭

UPDATE

正如在評論中指出,對於搞清楚顏色模型更方便的功能。 CGColorSpaceGetModel將返回值如kCGColorSpaceModelMonochromekCGColorSpaceModelRGB。這將消除以上的歧義。之後,您可以檢查RGB或CMYK的相同方式。

+0

無法CGColorSpaceGetNumberOfComponents返回4甚至vor RGBA結構圖像?你確定K必須和CYMK的C M和Y有相同的值嗎?當C,M和Y彼此相等時,它是否足夠? –

+0

@HermannKlecker iOS不會將alpha計算爲「顏色」,它會單獨處理它。不過你對CMYK是正確的。我沒有太多的經驗,所以我只是匆匆把它扔到那裏。我會修改。 – borrrden