将屏蔽图像作为PNG文件写入磁盘

Joo*_*ann 12 iphone cocoa-touch objective-c uikit ios

基本上我是从网络服务器下载图像,然后将它们缓存到磁盘,但在我这样做之前,我想掩盖它们.我正在使用每个人似乎都指出的屏蔽代码,可以在这里找到:http: //iosdevelopertips.com/cocoa/how-to-mask-an-image.html

但是会发生什么,图像显示正常,但是用于写入磁盘的版本

UIImage *img = [self maskImage:[UIImage imageWithData:data] withMask:self.imageMask];
[UIImagePNGRepresentation(img) writeToFile:cachePath atomically:NO];
Run Code Online (Sandbox Code Playgroud)

与后面显示的相比,它的alpha通道被反转(在这里使用相同的UIImage实例).

有任何想法吗?我确实需要屏蔽缓存版本,否则如果我每次必须屏蔽它们,那么在表格视图中显示图像会非常慢.

编辑:所以是的,UIImagePNGRepresentation(img)似乎反转了alpha通道,与写入磁盘的代码没有任何关系,这是相当明显的,但无论如何我都检查过.

epa*_*tel 14

如何绘制到新图像,然后保存?

UIGraphicsBeginImageContext(img.size);
[img drawAtPoint:CGPointZero];
UIImage *newImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[UIImagePNGRepresentation(newImg) writeToFile:cachePath atomically:NO];
Run Code Online (Sandbox Code Playgroud)

(另)


Hai*_*lei 5

看到在描述CGImageCreateWithMaskCGImage参考:

生成的图像取决于掩码参数是图像掩码还是图像.如果掩码参数是图像掩码,则图像掩码的源样本充当反α值.也就是说,如果图像掩模中的源样本的值是S,则使用α值(1-S)将图像中的对应区域与目的地混合.例如,如果S为1,则不绘制区域,而如果S为0,则区域完全绘制.

如果蒙版参数是图像,则它用作用于将图像混合到目标上的阿尔法蒙版.掩码的源样本'充当alpha值.如果掩码中源样本的值为S,则图像中的对应区域与目标字符串混合,其中字母为S.例如,如果S为0,则该区域不会绘制,而如果S为1,该地区是完全涂漆的.

由于某种原因,图像蒙mask image版在保存时被视为遮罩.根据:

要正确保存UIImagePNGRepresentation,有几种选择:

  1. 使用图像蒙版的反转版本.
  2. 使用"蒙版图像"代替"图像蒙版".
  3. 渲染到位图上下文然后保存,就像上面提到的epatel一样.