从另一个iOS中减去一个图像

Mat*_*der 9 objective-c uiimage ios

任何人都知道如何创建从另一个UIImage中减去一个UIImage

例如,作为此屏幕:

在此输入图像描述

谢谢你的回复!

Lil*_*ard 13

我相信你可以通过使用kCGBlendModeDestinationOut混合模式来实现这一目标.创建新上下文,绘制背景图像,然后使用此混合模式绘制前景图像.

UIGraphicsBeginImageContextWithOptions(sourceImage.size, NO, sourceImage.scale)
[sourceImage drawAtPoint:CGPointZero];
[maskImage drawAtPoint:CGPointZero blendMode:kCGBlendModeDestinationOut alpha:1.0f];
UIImage *result = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext();
Run Code Online (Sandbox Code Playgroud)


Tar*_*ark 4

减去图像意味着什么?给出的示例图像更多地显示了 !red 操作。假设从图像 b 中减去图像 a 意味着将 b 中与 a 中的像素相交的每个像素设置为透明。为了执行减法,我们实际上要做的是将图像 b 屏蔽为图像 a 的逆图像。因此,一个好的方法是从图像 a 的 alpha 通道创建图像蒙版,然后将其应用到 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);
Run Code Online (Sandbox Code Playgroud)

哇。然后,要屏蔽图像 b,您所要做的就是:

CGImageRef subtractedImage = CGImageCreateWithMask(b.CGImage, maskImage);
Run Code Online (Sandbox Code Playgroud)

嘿,急。