回答
這裏是@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:該圖像是灰度,完成(有一個例外:它可能是alpha-only,但我懷疑你會發送像這樣的任何圖像。一種方法來確定是否圖像是α-僅通過其CGAlphaInfo
)
CGColorSpaceGetNumberOfComponents
返回3:該圖像是RGB,並且需要進一步的分析,以確定它是否是灰度或不(作爲對方的回答狀態,循環通過像素,如果你找到一個地方!(R == G == B),那麼它不是灰度。
CGColorSpaceGetNumberOfComponents
返回4:此圖像是CMYK,並且需要進一步分析。 CMYK中的所有灰度應該是C == M == Y(通常它們將是0,否則任何東西都會浪費墨水(這種格式是專門爲打印機設計的),K等於任何值。
CGColorSpaceGetNumberOfComponents
回報別的東西:......好哭
UPDATE
正如在評論中指出,對於搞清楚顏色模型更方便的功能。 CGColorSpaceGetModel
將返回值如kCGColorSpaceModelMonochrome
或kCGColorSpaceModelRGB
。這將消除以上的歧義。之後,您可以檢查RGB或CMYK的相同方式。
無法CGColorSpaceGetNumberOfComponents返回4甚至vor RGBA結構圖像?你確定K必須和CYMK的C M和Y有相同的值嗎?當C,M和Y彼此相等時,它是否足夠? –
@HermannKlecker iOS不會將alpha計算爲「顏色」,它會單獨處理它。不過你對CMYK是正確的。我沒有太多的經驗,所以我只是匆匆把它扔到那裏。我會修改。 – borrrden
- 1. Emgu CV灰度圖像斑點檢測
- 2. 如何灰度圖像上使用邊緣檢測
- 3. 灰度圖像
- 4. 檢查灰度圖像中的像素是否爲黑色(OpenCV)
- 5. 灰度的圖像
- 6. 灰度PNG圖像
- 7. MATLAB:檢測灰度圖像中的非連續垂直條紋
- 8. 16bit灰度圖像的Sobel邊緣檢測輸出
- 9. 如何檢查BitmapImage是灰度?
- 10. 如何檢測href是否是圖像?
- 11. 如何輕鬆旋轉灰度圖像
- 12. 如何識別圖像是灰度圖像或彩色圖像在c#
- 13. gdImageCopy的圖像是灰度的
- 14. 如何從灰度圖像中獲取像素的灰度值xCode
- 15. 檢測圖像的亮度
- 16. 檢測圖像的高度
- 17. Php檢查圖像是灰度函數內存泄漏
- 18. OpenCV Emgu - 如何設置灰度圖像像素強度
- 19. 如何獲得灰度強度指針的灰度圖像在opencv
- 20. 着色灰度圖像
- 21. 顯示灰度圖像
- 22. 問題與灰度圖像
- 23. mouseover.js加載灰度圖像
- 24. 灰度圖像分析
- 25. 創建灰度圖像
- 26. jQuery使圖像灰度
- 27. OpenCL支持灰度圖像
- 28. 劃分灰度圖像
- 29. 着色灰度圖像as3
- 30. 3灰度圖像在Java
你爲什麼需要這個?你想做什麼? –
例如,ImageMagick。或者自己動手。你的問題不全:你想做什麼? –
@Srikar Appal我需要計算打印成本 – TUNER88