iphone - iphone iOS: 2步图像处理与 CoreGraphics

  显示原文与译文双语对照的内容
66 1

我正在使用 CoreGraphics ( 在我的三维方法里) 对图像( 透明 png ) 应用混合模式,然后调整结果的alpha值。我认为这需要用两个步骤来完成,但我可能错了。以下是我目前所拥有的( 哪一个工作正常):

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?? --

我想我需要把所有这些都画成某种单独的上下文,调用 CGContextSetAlpha(...),然后再回到原始上下文。在最后一个CGContextFillRect之前设置alpha将改变应用混合模式的数量,而不是整个图像的alpha 。

编辑:已经发布的屏幕截图

enter image description here

先谢谢了。

时间:原作者:0个回答

107 1

你可以使用透明层将混合应用到在 100%绘制的图像,并在 50%处显示结果。结果如下所示:
Image showing output我使用了纹理背景,以便你可以以清楚地看到下面的图像 50%透明,而不仅仅是另一个图像。下面是代码:

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);

编辑:旧内容占用大量空间,但没有帮助。如果你想看的话,看看修订历史。

原作者:
...