PHP GD:基于图像内容裁剪图像

时间:2014-07-10 16:28:00

标签: php gd

我有图像,所有图像都包含一个3px红色(#ff0000)边框的正方形。图像具有不同的尺寸,图像中的正方形尺寸也是可变的。

是否可以使用PHP GD裁剪红色边框内的部分?我意识到这需要两个步骤:首先找到红色边框,然后再进行裁剪。裁剪部分很简单,所以我的问题归结为:如何识别3px红色方框边框?

1 个答案:

答案 0 :(得分:0)

这是我找到找到边界的解决方案。它可能不是最佳的,但足以满足我想要实现的目标。

            <?php
            $im = imagecreatefrompng("image.png");
            $size = getimagesize("image.png");
            $width = $size[0];
            $height = $size[1];

            function find_border($direction, $first_last, $width, $height, $im)
            {
                if($direction == 'v')
                {
                    $attempts = array(round($width/10*5), round($width/10*4), round($width/10*6), round($width/10*3), round($width/10*7), round($width/10*2), round($width/10*8), round($width/10*1), round($width/10*9));
                    $limit = $height;
                }
                else
                {
                    $attempts = array(round($height/10*5), round($height/10*4), round($height/10*6), round($height/10*3), round($height/10*7), round($height/10*2), round($height/10*8), round($height/10*1), round($height/10*9));
                    $limit = $width;
                }

                foreach($attempts AS $attempt)
                {
                    if($first_last == 'f')
                    {
                        for($i=1;$i<$limit;$i++)
                        {
                            if($direction == 'h')
                            {
                                if(imagecolorat($im, $i-1, $attempt)==16711680) return $i;

                            }
                            else
                            {
                                if(imagecolorat($im, $attempt, $i-1)==16711680) return $i;
                            }
                        }
                    }
                    elseif($first_last == 'l')
                    {
                        for($i=$limit-1;$i>0;$i=$i-1)
                        {
                            if($direction == 'h')
                            {
                                if(imagecolorat($im, $i-1, $attempt)==16711680) return $i;

                            }
                            else
                            {
                                if(imagecolorat($im, $attempt, $i-1)==16711680) return $i;
                            }
                        }
                    }
                }
            }


            echo find_border('v', 'f', $width, $height, $im)."<hr>";
            echo find_border('v', 'l', $width, $height, $im)."<hr>";
            echo find_border('h', 'f', $width, $height, $im)."<hr>";
            echo find_border('h', 'l', $width, $height, $im)."<hr>";