任何人都知道如何创建从另一个UIImage中减去一个UIImage
例如作为此屏幕:
感谢您的回复!
答案 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)
}
}