Как сделать сравнение растровых изображений в iOS?
У меня есть три CGLayers, данные которых я хотел бы сравнить.
void *a = CGBitmapContextGetData(CGLayerGetContext(layerA));
void *b = CGBitmapContextGetData(CGLayerGetContext(layerB));
void *c = CGBitmapContextGetData(CGLayerGetContext(layerC));
Я хотел бы получить такой результат, как ((ИЛИ b) И в), где только биты, которые включены в layerA или layerB, а также включены в layerC, в конечном итоге в результате. Эти слои kCGImageAlphaOnly
таким образом, они всего лишь 8 бит "глубоко", и я только втянул в них с 1,0 альфа. Мне также не нужно знать, где находится перекрытие, мне просто нужно знать, есть ли какие- либо биты в результате.
Я действительно скучаю по QuickDraw сегодня, у него было много бит-ориентированных операций, которые были очень быстрыми. Есть мысли о том, как сделать что-то подобное?
2 ответа
Вот наивная реализация, предполагая, что все три имеют одинаковый размер:
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
и работать с четырьмя байтами одновременно.
Для более серьезной оптимизации вы должны проверить платформу Accelerate.
Что насчет CGBlendMode
с? kCGBlendModeDestinationOver
выступает в качестве OR
для А и В, а затем вы можете использовать kCGBlendModeDestinationIn
в AND
этот результат с C.