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

时间:2012-03-13 19:17:47

标签: objective-c ios uiimage

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

例如作为此屏幕:

enter image description here

感谢您的回复!

5 个答案:

答案 0 :(得分:13)

我相信您可以使用kCGBlendModeDestinationOut混合模式来完成此操作。创建新上下文,绘制背景图像,然后使用此混合模式绘制前景图像。

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

答案 1 :(得分:4)

减去图像意味着什么?给出的样本图像显示了更多的红色操作。让我们说从图像中减去图像a b意味着将b中与像素相交的每个像素设置为透明。为了执行减法,我们实际做的是将图像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);

呼。然后,要掩盖图像b,您所要做的就是:

CGImageRef subtractedImage = CGImageCreateWithMask(b.CGImage, maskImage);
嘿presto。

答案 2 :(得分:3)

要获得这些结果,请在绘制第一张图像时将第二张图像用作蒙版。对于这种绘图,您需要使用Core Graphics,a.k.a。Quartz 2D。 Quartz 2D Programming Guide 有一个名为Bitmap Images and Image Masks的部分,可以告诉你需要知道的一切。

您正在询问UIImage对象,但要使用Core Graphics,您需要使用CGImages。这没问题 - UIImage提供了CGImage属性,可以让您轻松获取所需的数据。

答案 3 :(得分:0)

Kevin Ballard的解决方案为我工作!在Swift 3.x中:

func subtract(source: UIImage, mask: UIImage) -> UIImage? {
    UIGraphicsBeginImageContextWithOptions(source.size, false, source.scale)
    source.draw(at: CGPoint.zero)
    mask.draw(at: CGPoint.zero, blendMode: .destinationOut, alpha: 1.0)
    let result = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return result
}

答案 4 :(得分:0)

iOS 10+和Swift 4+的更新答案:

func subtract(source: UIImage, mask: UIImage) -> UIImage? {
    return UIGraphicsImageRenderer(size: source.size).image { _ in
        source.draw(at: .zero)
        mask.draw(at: .zero, blendMode: .destinationOut, alpha: 1)
    }
}