如何计算图像的不透明部分以PHP开始和结束的位置?

如何计算图像的不透明部分以PHP开始和结束的位置?,php,transparency,imagemagick,gdlib,Php,Transparency,Imagemagick,Gdlib,这里有一个问题:假设我们有一张200x200的png图像,它是透明的,有一个形状从x,y(50,50)开始,宽度为50px,高度为20px 使用PHP(gdlib或imagemagick)是否有任何方法可以获得形状相对于图像大小的位置?对于给定的示例,脚本应该返回(x1=50,y1=70,x2=100,y2=70)它是什么意思“从开始的形状”?例如,对于椭圆,您希望找到覆盖整个椭圆的矩形的左上角 如果是,则可以从上到下循环通过图像的每个像素(getpixel将为您提供像素的颜色),搜索不透明的最

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

使用PHP(gdlib或imagemagick)是否有任何方法可以获得形状相对于图像大小的位置?对于给定的示例,脚本应该返回(x1=50,y1=70,x2=100,y2=70)

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

如果是,则可以从上到下循环通过图像的每个像素(
getpixel
将为您提供像素的颜色),搜索不透明的最顶部和最底部点(找到时结束循环)。这将是您的y1和y2点。然后,在y1-y2范围内从左到右循环,找到x1和x2

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

  • 查看第100行(高度/2)是否有对象
  • 如果是,请查找第50行(100/2)
  • 如果第50行包含对象,则扫描第25行(50/2)
  • 让我们假设第25行是透明的。您可能需要查看第38行(25/2+25)
  • 如果第38行不是透明的,您可以查看第32行([25/2]/2+25)

  • 顺便说一下,当你扫描第25行时,你在坐标x=74,y=50处发现了一个不透明的点。现在,当以相同的方式搜索最左边的点时,您可以从37(74/2)开始搜索,而不是从x=150(宽度/2)开始,因为您已经知道在x=74处有一个对象。

    Hi,thnx是真正有用的答案。我对一个长方形感兴趣。这种方法(通过每个像素循环)不是有太多的开销吗?嗯,我想有更多的优化方法。现在,如果您停止搜索找到的最上面的像素,或最右边的像素,等等,它已经优化了很多东西。我编辑了我的问题,包括优化建议(即减少开销)。