【问题标题】:Create mask from part of the image in iOS在 iOS 中从图像的一部分创建蒙版
【发布时间】:2012-02-23 01:41:55
【问题描述】:

我正在为 iPad (iOS4+) 开发一个涂色本应用程序。应用程序应该允许一次只为图像的一个区域着色。

我的意思是,如果用户触摸屏幕上的任何位置并开始移动手指,则颜色应仅应用于与第一个触摸点位于同一区域内的那些像素。例如,如果用户触摸左侧图像的中心并开始在整个图像上移动手指,他应该会得到与右侧图像类似的东西。

我认为该任务的解决方案之一可能是创建一个形状为触摸区域的蒙版,然后在进行进一步修改之前将此蒙版应用于图像。但是,老实说,我不知道从哪里开始。

您能告诉我如何制作这样的面具吗?

该解决方案可能使用 Core Graphics 和 Open GL。

【问题讨论】:

  • 听起来像是flood fill algorithm 的任务。
  • @Till 你能详细说明一下吗?
  • @Borbrovsky 使用泛洪填充来查找边界并根据结果创建蒙版。

标签: ios ipad image-processing opengl-es core-graphics


【解决方案1】:

正如@Till 所建议的,我实现了排队洪水填充算法。我必须做some optimizations 以将内存消耗和执行速度保持在合理的范围内。

我不使用算法来真正填充图像。我使用算法来创建蒙版:

  • 创建一个掩码字节数组(image_width * image_height bytes)
  • 用 0xFF 值填充整个数组
  • 使用填充算法查找区域内的所有像素以及包含该区域的矩形的坐标。
  • 对于每个找到的像素,将掩码字节数组中的相应值设置为 0
  • 创建另一个(较小的)掩码字节数组,并将掩码字节数组的一部分(由计算的矩形定义)复制到新数组中。
  • 使用以下代码创建掩码
NSData* maskData = // 从掩码字节构造 NSData CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((CFMutableDataRef)maskData); 整数宽度 = maskRight - maskLeft + 1; int 高度 = maskBottom - maskTop + 1; CGImageRef maskImage = CGImageMaskCreate(width, height, 8, 8, width, dataProvider, NULL, YES); CGDataProviderRelease(dataProvider);
  • 您可以稍后使用如下代码使用掩码
CGContextSaveGState(上下文); CGContextTranslateCTM(上下文, 0.0, 768); CGContextScaleCTM(上下文, 1.0, -1.0); CGRect r = CGRectApplyAffineTransform(maskImageRect, CGContextGetCTM(context)); CGContextClipToMask(context, r, maskImage); CGContextTranslateCTM(上下文, 0.0, 768); CGContextScaleCTM(上下文, 1.0, -1.0); // 蒙版已设置,在此处绘制 CGContextRestoreGState(上下文);

使用此代码,您可以创建任何形状的蒙版。如果需要,您甚至可以创建半透明蒙版。要创建半透明蒙版,您需要在透明区域的蒙版字节数组中设置 0 以外的一些值(0 - 完全透明,255 - 完全不透明)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 2015-07-09
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多