что значит вычесть изображение?На приведенном примере показано больше операции! red.допустим, что вычитать изображение a из изображения b означает установить каждый пиксель в b, который пересекает пиксель в a, в прозрачный.чтобы выполнить вычитание, мы фактически маскируем изображение b к изображению a.Итак, хорошим подходом было бы создать маску изображения из альфа-канала изображения a, а затем применить ее к b.чтобы создать маску, вы должны сделать что-то вроде этого:
// get access to the image bytes
CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
// create a buffer to hold the mask values
size_t width = CGImageGetWidth(image.CGImage);
size_t height = CGImageGetHeight(image.CGImage);
uint8_t *maskData = malloc(width * height);
// iterate over the pixel data, reading the alpha value
uint8_t *alpha = (uint8_t *)CFDataGetBytePtr(pixelData) + 3;
uint8_t *mask = maskData;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
*mask = *alpha;
mask++;
alpha += 4; // skip to the next pixel
}
}
// create the mask image from the buffer
CGDataProviderRef maskProvider = CGDataProviderCreateWithData(NULL, maskData, width * height, NULL);
CGImageRef maskImage = CGImageMaskCreate(width, height, 8, 8, width, maskProvider, NULL, false);
// cleanup
CFRelease(pixelData);
CFRelease(maskProvider);
free(maskData);
Вот так.затем, чтобы замаскировать изображение b, все, что вам нужно сделать, это:
CGImageRef subtractedImage = CGImageCreateWithMask(b.CGImage, maskImage);
эй presto.