Как сделать сравнение растровых изображений в 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.

Другие вопросы по тегам