【问题标题】:With PHP/GD, how do I trim an image?使用 PHP/GD,如何修剪图像?
【发布时间】:2010-12-11 21:14:58
【问题描述】:

我想用 GD 和 PHP模仿 Photoshop 的修剪行为(裁剪四面都被相同颜色覆盖的区域),但我缺乏关于如何实现这一点的想法。

如果有人对如何做到这一点有任何想法,我非常想听听。

提前致谢。

【问题讨论】:

  • 你嫁给GD了吗? ImageMagick 已经简化了它。

标签: php image image-processing gd gdi


【解决方案1】:

我能想到的最简单的解决方案是:

  1. 找出左上角像素的颜色。
  2. 逐行遍历图像,水平和垂直,分别从顶部、底部、左侧和右侧开始。如果一行仅包含左上角遇到的颜色,则它是可修剪的空白区域。通过增加 imagecopy*() 函数的 x 或 y 坐标,从生成的图像中省略该行。

未经测试但可能有效。

顺便说一句,ImageMagick 可以开箱即用:http://www.imagemagick.org/Usage/crop/#trim

【讨论】:

    【解决方案2】:

    Here's 一个示例函数(也可以添加填充):

    // Trims an image then optionally adds padding around it.
    // $im  = Image link resource
    // $bg  = The background color to trim from the image
    // $pad = Amount of padding to add to the trimmed image
    //        (acts simlar to the "padding" CSS property: "top [right [bottom [left]]]")
    function imagetrim(&$im, $bg, $pad=null){
    
        // Calculate padding for each side.
        if (isset($pad)){
            $pp = explode(' ', $pad);
            if (isset($pp[3])){
                $p = array((int) $pp[0], (int) $pp[1], (int) $pp[2], (int) $pp[3]);
            }else if (isset($pp[2])){
                $p = array((int) $pp[0], (int) $pp[1], (int) $pp[2], (int) $pp[1]);
            }else if (isset($pp[1])){
                $p = array((int) $pp[0], (int) $pp[1], (int) $pp[0], (int) $pp[1]);
            }else{
                $p = array_fill(0, 4, (int) $pp[0]);
            }
        }else{
            $p = array_fill(0, 4, 0);
        }
    
        // Get the image width and height.
        $imw = imagesx($im);
        $imh = imagesy($im);
    
        // Set the X variables.
        $xmin = $imw;
        $xmax = 0;
    
        // Start scanning for the edges.
        for ($iy=0; $iy<$imh; $iy++){
            $first = true;
            for ($ix=0; $ix<$imw; $ix++){
                $ndx = imagecolorat($im, $ix, $iy);
                if ($ndx != $bg){
                    if ($xmin > $ix){ $xmin = $ix; }
                    if ($xmax < $ix){ $xmax = $ix; }
                    if (!isset($ymin)){ $ymin = $iy; }
                    $ymax = $iy;
                    if ($first){ $ix = $xmax; $first = false; }
                }
            }
        }
    
        // The new width and height of the image. (not including padding)
        $imw = 1+$xmax-$xmin; // Image width in pixels
        $imh = 1+$ymax-$ymin; // Image height in pixels
    
        // Make another image to place the trimmed version in.
        $im2 = imagecreatetruecolor($imw+$p[1]+$p[3], $imh+$p[0]+$p[2]);
    
        // Make the background of the new image the same as the background of the old one.
        $bg2 = imagecolorallocate($im2, ($bg >> 16) & 0xFF, ($bg >> 8) & 0xFF, $bg & 0xFF);
        imagefill($im2, 0, 0, $bg2);
    
        // Copy it over to the new image.
        imagecopy($im2, $im, $p[3], $p[0], $xmin, $ymin, $imw, $imh);
    
        // To finish up, we replace the old image which is referenced.
        $im = $im2;
    }
    

    【讨论】:

    • 你能举一个$bg预期输入的例子吗?
    猜你喜欢
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    相关资源
    最近更新 更多