如何自动找到PNG内边界的坐标,并保持透明度?

时间:2009-05-14 11:32:55

标签: iphone objective-c cocoa-touch uikit

想象一下:我有一张显示泰迪熊或三角形的PNG图像。非二次的东西。现在,我想找出一个给定的行和方向(与UIImageView的坐标系相对的坐标)的实际可见图像开始。

示例:让我们说,当我看到最后一行时,我需要知道泰迪熊的脚从左边开始。当然,这不仅仅是frame.origin.x,因为脚不是二次的。它可能从x = 12开始。

我会以某种方式迭代图像数据并检查像素:“嘿,你透明吗?”。如果是的话,我会继续下一个。 “嘿,你怎么了?透明吗?”直到我得到结果:“不!我完全不透明!”。然后我知道:“对!在这里,双脚从PNG开始!这就是边界!”。

然后,我为每一行做到这一点并获得某种路径坐标。 就个人而言,我需要这个来检测旋转机器的完美点,因为我想让它在地板上摆动一些。我不能只使用框架宽度和原始信息。这不太现实。

那么:有没有办法反省UIImage或图像的数据,以检查像素是否透明?

3 个答案:

答案 0 :(得分:3)

我在网上找到了this tutorial,您可以在屏幕上获得每个像素的UIColor(ARGB)值。也许如果你稍微调整一下你可以传递一个UIImage并获得你需要的所有值

答案 1 :(得分:2)

使用UIImage似乎没有一种相当简单的方法。相反,我看到两个更简单的选择。

理想情况下,如果您控制正在使用的图像,则可以预先计算所需的数据。然后,您可以重新格式化图像,使您感兴趣的点位于图像的中心(您可以使用宽度和高度轻松计算客户端),或者将坐标与图像一起发送。这样可以节省客户端为每张图像重新计算的时间,这可能会加快您的应用程序并延长电池寿命。

或者,像libpng这样的图像库可以静态编译到您的程序中。您可以加载图像,进行处理,然后卸载它并将文件传递给UIImage。只会链接您使用的函数,因此您可以避免添加太多膨胀,因为可能会省略渲染例程。这样做的缺点是使您的软件依赖第三方库。

答案 2 :(得分:1)

您可能会发现使用已知格式创建内存上下文更容易,然后将图像渲染到内存中的上下文中。请注意,目标上下文可以是与原始图像不同的位图格式和颜色模式,旨在便于阅读。

或者,如果你是一个贪婪的惩罚,你可以获得UIImage的CGImage属性,然后使用CoreGraphics函数来确定像素格式,然后编写代码来解码像素格式数据......

最后一个选项,如果您控制正在使用的图像:从图像创建一个蒙版图像(1位alpha),然后使用它来确定边缘的位置。您可以轻松地在图形编辑器中创建这样的蒙版,或者如果正确设置图形属性,则可以通过将图像绘制到1位内存上下文中来实现。