Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从iOS中的部分图像创建遮罩_Ios_Ipad_Image Processing_Opengl Es_Core Graphics - Fatal编程技术网

从iOS中的部分图像创建遮罩

从iOS中的部分图像创建遮罩,ios,ipad,image-processing,opengl-es,core-graphics,Ios,Ipad,Image Processing,Opengl Es,Core Graphics,我正在为iPad(iOS4+)开发一个配色系统应用程序。应用程序一次只允许对图像的一个区域着色 我的意思是,如果用户触摸屏幕上的任何地方并开始移动手指,则颜色应仅应用于与第一个触摸点位于同一区域内的像素。例如,如果用户触摸左边图像的中心并开始在图像上移动手指,他应该会得到类似右边图像的东西 我认为这项任务的解决方案之一可能是创建一个与所接触区域形状相同的遮罩,然后在进行进一步修改之前将此遮罩应用于图像。但是,老实说,我不知道从哪里开始 你能告诉我如何制作这样一个面具吗 解决方案可能使用核心图形

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

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

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

你能告诉我如何制作这样一个面具吗


解决方案可能使用核心图形和OpenGL。

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

我不使用算法来真正填充图像。我使用该算法创建遮罩:

  • 创建掩码字节数组(图像宽度*图像高度字节)
  • 用0xFF值填充整个数组
  • 使用整体填充算法查找区域内的所有像素以及包含该区域的矩形的坐标
  • 对于每个找到的像素,将掩码字节数组中的对应值设置为0
  • 创建另一个(较小的数组)掩码字节,并将掩码字节数组的一部分(由计算出的矩形定义)复制到新数组中
  • 使用以下代码创建一个掩码
NSData*maskData=//从掩码字节构造NSData CGDataProviderRef dataProvider=CGDataProviderCreateWithCFData((CFMutableDataRef)maskData); int width=maskRight-maskLeft+1; int height=maskBottom-maskTop+1; CGImageRef maskImage=CGImageMaskCreate(宽度、高度、8、8、宽度、数据提供程序、NULL、是); CGDataProviderRelease(数据提供者);
  • 稍后可以使用如下代码使用掩码
CGContextSaveGState(上下文); CGContextTranslateCTM(上下文,0.0768); CGContextScaleCTM(上下文,1.0,-1.0); CGRect r=CGRectApplyAffineTransform(maskImageRect,CGContextGetCTM(context)); CGContextClipToMask(上下文、r、maskImage); CGContextTranslateCTM(上下文,0.0768); CGContextScaleCTM(上下文,1.0,-1.0); //蒙版已设置,请在此处绘制 CGContextRestoreGState(上下文);
使用此代码可以创建任何形状的遮罩。如果需要,甚至可以创建半透明遮罩。要创建半透明遮罩,您需要在透明区域的遮罩字节数组(0-完全透明,255-完全不透明)中设置除0以外的一些值。

听起来像是一项任务。@Till您能详细说明一下吗?@Borbrovsky使用泛光填充查找边界并根据结果创建遮罩。 NSData* maskData = // construct NSData from mask bytes CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((CFMutableDataRef)maskData); int width = maskRight - maskLeft + 1; int height = maskBottom - maskTop + 1; CGImageRef maskImage = CGImageMaskCreate(width, height, 8, 8, width, dataProvider, NULL, YES); CGDataProviderRelease(dataProvider); CGContextSaveGState(context); CGContextTranslateCTM(context, 0.0, 768); CGContextScaleCTM(context, 1.0, -1.0); CGRect r = CGRectApplyAffineTransform(maskImageRect, CGContextGetCTM(context)); CGContextClipToMask(context, r, maskImage); CGContextTranslateCTM(context, 0.0, 768); CGContextScaleCTM(context, 1.0, -1.0); // mask is setup, draw here CGContextRestoreGState(context);