合并两个透明图像而不失透明度

时间:2016-01-25 19:02:04

标签: ios objective-c uiimage core-graphics

我有两个透明背景的PNG图像。 我需要将它们合并到一个图像而不会丢失透明背景。

我使用了这段代码

  UIGraphicsBeginImageContext(firstImage.size);
  CGContextRef context = UIGraphicsGetCurrentContext();

  CGContextSaveGState(context);

  CGContextTranslateCTM(context, 0, firstImage.size.height);
  CGContextScaleCTM(context, 1.0, -1.0);
  CGRect rect = CGRectMake(0, 0, firstImage.size.width,firstImage.size.height);
  // draw white background to preserve color of transparent pixels
  CGContextSetBlendMode(context, kCGBlendModeDarken);
  [[UIColor whiteColor] setFill];
  CGContextFillRect(context, rect);

 CGContextSaveGState(context);
 CGContextRestoreGState(context);

  // draw original image
  CGContextSetBlendMode(context, kCGBlendModeDarken);
  CGContextDrawImage(context, rect, firstImage.CGImage);

  // tint image (loosing alpha) - the luminosity of the original image is preserved
  CGContextSetBlendMode(context, kCGBlendModeDarken); 
 //CGContextSetAlpha(context, .85);
  [[UIColor colorWithPatternImage:secondImage] setFill];
 CGContextFillRect(context, rect);


 CGContextSaveGState(context);
 CGContextRestoreGState(context);

 // mask by alpha values of original image
 CGContextSetBlendMode(context, kCGBlendModeDestinationIn);
 CGContextDrawImage(context, rect, firstImage.CGImage);

 // image drawing code here
 CGContextRestoreGState(context);
 UIImage *coloredImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();

 return coloredImage;

但它会返回一张白色背景的图像。

知道为什么,拜托?

2 个答案:

答案 0 :(得分:2)

如果您的两张图片都具有透明度,那么使用正常的混合模式绘制它们都不会以任何方式“失败”'透明度。

你应该只能在另一个上面绘制一个:

UIGraphicsBeginImageContext(firstImage.size); // Assumes the first image is the same size as the second image.
CGContextRef context = UIGraphicsGetCurrentContext();

CGContextTranslateCTM(context, 0, firstImage.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

CGContextDrawImage(context, rect, firstImage.CGImage);
CGContextDrawImage(context, rect, secondImage.CGImage);

UIImage *coloredImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return coloredImage;

您也不需要保存和恢复上下文的图形状态(至少在 all 图形之外),除非您要重用上下文。

答案 1 :(得分:0)

我对这个问题并不是很了解,但让我们试试......

尝试使用 setOpaque 设置图像所在的视图,如下图所示......

[self.thatView setOpaque:NO]

希望有所帮助。