在屏幕上获取某种颜色占用的区域 – iOS

我试图做一些类似于这个问题的问题 ,但是我并不真正理解这个问题的答案,我不确定这是否是我需要的。

我需要的是简单的,但我不太确定这很容易。 我想计算屏幕上某个颜色的像素数量。 我知道我们看到的每个“像素”实际上是不同颜色的像素的组合,例如绿色。 所以我需要的是实际的颜色 – 用户所看到的颜色。

例如,如果我创build了一个UIView,将背景颜色设置为[UIColor greenColor] ,并将其尺寸设置为屏幕区域的一半(我们可以假定状态栏为简单起见而隐藏,而且我们在iPhone上),我希望这个“神奇的方法”返回240 * 160或38,400-屏幕的一半面积。

我不希望有人写出这个“魔法”,但我想知道

a)如果这是可能的

b)如果是这样,几乎是实时的

c)如果是这样,从哪里开始。 我听说可以用OpenGL完成,但是我没有这方面的经验。

这是我的解决scheme,感谢Radif Sharafullin:

 int pixelsFromImage(UIImage *inImage) { CGSize s = inImage.size; const int width = s.width; const int height = s.height; unsigned char* pixelData = malloc(width * height); int pixels = 0; CGContextRef context = CGBitmapContextCreate(pixelData, width, height, 8, width, NULL, kCGImageAlphaOnly); CGContextClearRect(context, CGRectMake(0, 0, width, height)); CGContextDrawImage(context, CGRectMake(0, 0, width, height), inImage.CGImage ); CGContextRelease(context); for(int idx = 0; idx < width * height; ++idx) { if(pixelData[idx]) { ++pixels; } } free(pixelData); return pixels; } 

有可能的。 我已经做了类似的计算透明像素的百分比,但由于我需要粗略的估计,我没有看每个像素,而是每十个像素,在下面的代码中的stepvariables。

 BOOL isImageErased(UIImage *inImage, float step, int forgivenessCount){ CGSize s = inImage.size; int width = s.width; int height = s.height; unsigned char* pixelData = malloc( width * height ); int forgivenessCounter=0; CGContextRef context = CGBitmapContextCreate ( pixelData, width, height, 8, width, NULL, kCGImageAlphaOnly ); CGContextClearRect(context, CGRectMake(0, 0, width, height)); CGContextDrawImage( context, CGRectMake(0, 0, width, height), inImage.CGImage ); CGContextRelease( context ); for (int x=0; x<width; x=x+step) { for (int y=0; y<height; y=y+step) { if(pixelData[y * width + x]) { forgivenessCounter++; if (forgivenessCounter==forgivenessCount) { free(pixelData); return FALSE; } }; } } free( pixelData ); return TRUE;} 

我相信如果您传递预处理的灰度图像或修改API的kCGImageAlphaOnly设置,则可以将此代码用于您的目的。

希望有所帮助

Swift 3中编写的eric.mitchell解决scheme

 func pixelsFromImage(inImage: UIImage) -> Int { let width = Int(inImage.size.width) let height = Int(inImage.size.height) let bitmapBytesPerRow = width let bitmapByteCount = bitmapBytesPerRow * height let pixelData = UnsafeMutablePointer<UInt8>.allocate(capacity: bitmapByteCount) let colorSpace = CGColorSpaceCreateDeviceGray() let context = CGContext(data: pixelData, width: width, height: height, bitsPerComponent: 8, bytesPerRow: bitmapBytesPerRow, space: colorSpace, bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.alphaOnly.rawValue).rawValue)! let rect = CGRect(x: 0, y: 0, width: width, height: height) context.clear(rect) context.draw(inImage.cgImage!, in: rect) var pixels = 0 for x in 0...width { for y in 0...height { if pixelData[y * width + x] > 0 { pixels += 1 } } } free(pixelData) return pixels }