代码之家  ›  专栏  ›  技术社区  ›  Joonas Trussmann

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

  •  12
  • Joonas Trussmann  · 技术社区  · 15 年前

    基本上,我是从Web服务器下载图像,然后将它们缓存到磁盘上,但在此之前,我想屏蔽它们。 我使用的是每个人似乎都指向的屏蔽码,可以在这里找到: 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];
    

    有什么想法吗?我确实需要屏蔽缓存版本,否则在表视图中显示图像会非常慢,如果每次都要屏蔽它们的话。

    编辑:是的,UIImagePNGRepresentation(img)似乎反转了alpha通道,与写入磁盘的代码没有任何关系,这很明显,但我还是检查了。

    3 回复  |  直到 7 年前
        1
  •  14
  •   epatel    12 年前

    把它画成一个新的图像,然后保存怎么样?

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

    (未经测试)

        2
  •  5
  •   Community Bayu Bramantya    4 年前

    请参见中的描述 CGImageCreateWithMask CGImage Reference :

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

    如果mask参数是图像,那么它将用作将图像混合到目标上的alpha遮罩。“遮罩”的源样本用作alpha值。如果遮罩中的源采样值为S,则图像中的对应区域将与具有S的alpha的目标混合。例如,如果S为0,则不绘制该区域,而如果S为1,则完全绘制该区域。

    似乎出于某种原因,图像遮罩被视为 mask image

    正确保存 UIImagePNGRepresentation

    1. 使用图像遮罩的反转版本。
    2. 使用“遮罩图像”而不是“图像遮罩”。
    3. 渲染到位图上下文,然后保存它,如epatel所述。