如何计算图像的非透明部分以PHP开头和结尾的位置?

时间:2010-07-08 13:01:03

标签: php transparency imagemagick gdlib

这是一个问题:假设我们有一个透明的png图像200x200,其形状从x,y(50,50)开始,宽度为50px,高度为20px。

有没有办法使用PHP(gdlib或imagemagick),我可以得到相对于图像大小的形状的位置?对于给出的示例,脚本应该返回(x1 = 50,y1 = 70,x2 = 100,y2 = 70)

1 个答案:

答案 0 :(得分:3)

什么意思是“从”开始的形状“?例如,对于椭圆,您想要找到一个矩形的左上角,它将覆盖整个椭圆?

如果是,那么你可以从上到下遍历图像的每个像素(getpixel会给你一个像素的颜色),搜索不透明的最上面和最下面的点(结束循环)什么时候发现)。它将是您的 y1 y2 点。然后,你做同样的事情从左到右循环在y1 - y2范围内找到 x1 x2

这可能不是很优化,所以你可能想要想象一个更好的算法。例如,如果图像为300×200像素,则可以通过以下方式搜索最高点:

  1. 查看第100行(高度/ 2)是否有物体。
  2. 如果是这样,寻找第50行(100/2)。
  3. 如果第50行包含对象,则扫描第25行(50/2)。
  4. 让我们假设第25行是透明的。您可能需要查看第38行(25/2 + 25)。
  5. 如果第38行不透明,您可以查看第32行([25/2] / 2 + 25)。
  6. ...
  7. 顺便说一下,当你扫描第25行时,你在坐标 x = 74,y = 50 处找到了一个非透明点。现在,当以最相同的方式搜索最左边的点时,你可以从37(74/2)开始,而不是从 x = 150 (宽度/ 2)开始,因为你已经知道那里< strong> x = 74 的对象。