如何比较iOS中的位图?

我有三个CGLayers谁是我想比较的数据。

void *a = CGBitmapContextGetData(CGLayerGetContext(layerA)); void *b = CGBitmapContextGetData(CGLayerGetContext(layerB)); void *c = CGBitmapContextGetData(CGLayerGetContext(layerC)); 

我想得到像((a或b)和c)这样的结果,其中只有在layerA或layerB中以及在layerC中on的位最终在结果中。 这些图层是kCGImageAlphaOnly所以它们只有8位“深”,我只用1.0 alpha来绘制它们。 我也不需要知道重叠在哪里,我只需要知道结果中是否有任何位。

我今天真的很想念QuickDraw,它有很多面向比特的操作非常快。 有关如何完成这样的事情的任何想法?

这是一个天真的实现,假设所有三个是相同的大小:

 unsigned char *a = CGBitmapContextGetData(CGLayerGetContext(layerA)); unsigned char *b = CGBitmapContextGetData(CGLayerGetContext(layerB)); CGContextRef context = CGLayerGetContext(layerC); unsigned char *c = CGBitmapContextGetData(context); size_t bytesPerRow = CGBitmapContextGetBytesPerRow(context); size_t height = CGBitmapContextGetHeight(context); size_t len = bytesPerRow * height; BOOL bitsFound = NO; for (int i = 0; i < len; i++) { if ((a[i] | b[i]) & c[i]) { bitsFound = YES; break; } } 

既然你渴望QuickDraw,我想你可以自己写,而且你知道这可能会很慢。

如果可以保证位图大小,则可以使用int而不是char并一次操作四个字节。

对于更严重的优化,您应该检查加速框架。

那么CGBlendMode呢? kCGBlendModeDestinationOver作为A和B的OR ,然后你可以使用kCGBlendModeDestinationIn来得到与C的结果。