简体   繁体   English

iOS:使用CoreGraphics进行2步图像处理

[英]iOS: 2 Step Image Processing with CoreGraphics

Using CoreGraphics (inside my drawRect method), I'm trying to apply a blend mode to an image (transparent png), and then adjust the alpha of the result. 使用CoreGraphics(在我的drawRect方法中),我正在尝试将混合模式应用于图像(透明png),然后调整结果的alpha。 I'm assuming that this needs to be done in two steps, but I could be wrong. 我假设这需要分两步完成,但我可能错了。 Here's what I have so far (which works fine): 这是我到目前为止(工作正常):

CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSaveGState(context);

//SET COLOR - EDIT... added a more practical color example
CGContextSetRGBFillColor(context, 0.0, 1.0, 0.0, 1);

//flips drawing context (apparently this is necessary)
CGContextTranslateCTM(context, 0.0, self.bounds.size.height);
CGContextScaleCTM(context, 1.0, -1.0);//flip context

//DRAW PIN IMAGE
UIImage *pin = [UIImage imageNamed:@"pin"];
CGRect pinrect = CGRectMake(12, 17, 25, 25);    
CGContextDrawImage(context, pinrect, pin.CGImage);//draws image in context

//Apply blend mode
CGContextSetBlendMode(context, kCGBlendModeColor); 
CGContextClipToMask(context, pinrect, pin.CGImage); // restricts drawing to within alpha channel

//fills context with mask, applying blend mode
CGContextFillRect(context, pinrect); 

CGContextRestoreGState(context);

// -- Do something here to make result 50% transparent ?? --

I'm assuming that I need to draw all this into some kind of separate context somewhere, call CGContextSetAlpha(...) , and then re-draw it back to my original context, but I'm not sure how. 我假设我需要将所有这些绘制到某个单独的上下文中,调用CGContextSetAlpha(...) ,然后将其重新绘制回原始上下文,但我不确定如何。 Setting the alpha before my final CGContextFillRect will just change the amount that the blend mode was applied, not the alpha of the entire image. 在我的最终CGContextFillRect之前设置alpha只会改变应用混合模式的数量,而不是整个图像的alpha。

EDIT: screenshot posted 编辑:截图发布

在此输入图像描述

Thanks in advance. 提前致谢。

Using transparency layers, you can apply the blend to an image drawn at 100% and display the result at 50%. 使用透明层,可以将混合应用于以100%绘制的图像,并将结果显示为50%。 The result looks like this: 结果如下:
图像显示输出 I used the textured background so that you could clearly see that the lower image is 50% transparent to everything, instead of just the other image as was the case in my previous attempt. 我使用带纹理的背景,这样你就可以清楚地看到下面的图像对所有东西都是50%透明,而不是像我之前尝试的那样只是另一张图像。 Here is the code: 这是代码:

CGContextRef context = UIGraphicsGetCurrentContext();

CGContextTranslateCTM(context, 0.0, self.bounds.size.height);
CGContextScaleCTM(context, 1.0, -1.0);//flip context

CGRect fullImageRect = (CGRect){42,57,100,100};
CGRect transparentImageRect = (CGRect){12,17,100,100};
CGContextSetRGBFillColor(context, 0.0, 1.0, 0.0, 1);

// Draw image at 100%
UIImage *testImage = [UIImage imageNamed:@"TestImage"];
CGContextDrawImage(context,fullImageRect,testImage.CGImage);

// Set 50% transparency and begin a transparency layer. Inside the transparency layer, the alpha is automatically reset to 1.0
CGContextSetAlpha(context,0.5);
CGContextBeginTransparencyLayer(context, NULL);
// Draw the image. It is viewed at 100% within the transparency layer and 50% outside the transparency layer.
CGContextDrawImage(context, transparentImageRect, testImage.CGImage);
// Draw blend on top of image
CGContextClipToMask(context, transparentImageRect, testImage.CGImage);
CGContextSetBlendMode(context, kCGBlendModeColor);
CGContextFillRect(context, transparentImageRect);
// Exit transparency layer, causing the image and blend to be composited at 50%.
CGContextEndTransparencyLayer(context);

Edit: Old content removed as it took a lot of space and wasn't helpful. 编辑:删除旧内容,因为它占用了大量空间并且没有帮助。 Look in the revision history if you want to see it. 如果要查看,请查看修订历史记录。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM