gpt4 book ai didi

ios - 从 iOS 中的部分图像创建 mask

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:23:41 26 4
gpt4 key购买 nike

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

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

enter image description here

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

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

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

最佳答案

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

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

  • 创建掩码字节数组(image_width * image_height 字节)
  • 用 0xFF 值填充整个数组
  • 使用flood-fill算法找到区域内的所有像素和包含该区域的矩形的坐标。
  • 对于每个找到的像素,将掩码字节数组中的相应值设置为 0
  • 创建另一个(较小的数组)掩码字节并将掩码字节数组的部分(由计算的矩形定义)复制到新数组。
  • 使用以下代码创建 mask
    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);

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

关于ios - 从 iOS 中的部分图像创建 mask ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9077825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com