Php 修剪图像中的空白,然后使用';填充';

Php 修剪图像中的空白,然后使用';填充';,php,imagemagick,gd,photoshop,image-resizing,Php,Imagemagick,Gd,Photoshop,Image Resizing,我不介意这是通过PHP脚本(最好是Codeigniter,但任何都可以)还是通过Photoshop操作完成的 基本上,我想得到一个图像,我可以做到以下几点: 修剪图像周围所有“无聊”的空白 调整大小至最大380px(高度和宽度) 最后,将图像填充到400px x 400px(例如,在修改后的图像周围放置我自己的“白色”填充) 有人能给我一些关于如何使用GD/ImageMagick或任何合适的PHP脚本/库来实现这一点的提示吗 到目前为止,我已经尝试了以下方法 $gd = imagecreat

我不介意这是通过PHP脚本(最好是Codeigniter,但任何都可以)还是通过Photoshop操作完成的

基本上,我想得到一个图像,我可以做到以下几点:

  • 修剪图像周围所有“无聊”的空白
  • 调整大小至最大380px(高度和宽度)
  • 最后,将图像填充到400px x 400px(例如,在修改后的图像周围放置我自己的“白色”填充)
  • 有人能给我一些关于如何使用GD/ImageMagick或任何合适的PHP脚本/库来实现这一点的提示吗

    到目前为止,我已经尝试了以下方法

      $gd = imagecreatefromjpeg('./assets/temp/whitespace-img.jpg');
      imagetrim($gd, '#ffffff', null);
    
        function imagetrim($im, $bg, $pad=null, $output=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);
    
        if ($output)
        {
            imagejpeg($im2, $output);           
        }
    
        // To finish up, we replace the old image which is referenced.
        $im = $im2;
    }
    
    $gd=imagecreatefromjpeg('./assets/temp/whitespace img.jpg');
    imagetrim($gd,#ffffff',空);
    函数imagetrim($im、$bg、$pad=null、$output=null){
    //计算每边的填充。
    如果(isset($pad)){
    $pp=爆炸(“”,$pad);
    如果(isset($pp[3])){
    $p=数组((int)$pp[0],(int)$pp[1],(int)$pp[2],(int)$pp[3]);
    }else if(isset($pp[2])){
    $p=数组((int)$pp[0],(int)$pp[1],(int)$pp[2],(int)$pp[1]);
    }else if(isset($pp[1])){
    $p=数组((int)$pp[0],(int)$pp[1],(int)$pp[0],(int)$pp[1]);
    }否则{
    $p=数组填充(0,4,(int)$pp[0]);
    }
    }否则{
    $p=数组填充(0,4,0);
    }
    //获取图像的宽度和高度。
    $imw=imagesx($im);
    $imh=imagesy($im);
    //设置X变量。
    $xmin=$imw;
    $xmax=0;
    //开始扫描边缘。
    对于($iy=0;$iy>16)和0xFF,($bg>>8)和0xFF,$bg&0xFF);
    imagefill($im2,0,0,$bg2);
    //将其复制到新图像。
    imagecopy($im2、$im、$p[3]、$p[0]、$xmin、$ymin、$imw、$imh);
    如果(产出)
    {
    imagejpeg($im2,$output);
    }
    //最后,我们替换引用的旧图像。
    $im=$im2;
    }
    
    此Photoshop脚本将执行您想要的操作。请记住,微调功能仅适用于右下或左上像素颜色。如果边境地区“肮脏”,这就行不通了

    var srcDoc=app.activeDocument;
    //将图像修剪为透明宽度
    srcDoc.trim(TrimType.TOPLEFT,true,true,true);
    var w=srcDoc.width.value;
    var h=srcDoc.height.value;
    
    如果(w)您在尝试中使用了什么?我已经添加了我的尝试。但是似乎没有做任何事情:(稍微修改了函数,使其包含了将其输出到文件的选项,为这一出色的工作干杯!我实际上已经设法在PHP脚本中使其工作,但我会给你答案,因为我可能更愿意下次尝试你的方法,谢谢!最后使用上面的脚本与此相结合使其工作
    var srcDoc = app.activeDocument;
    
    //trim image to transparent width
    srcDoc.trim(TrimType.TOPLEFT, true, true, true, true);
    
    var w = srcDoc.width.value;
    var h = srcDoc.height.value;
    
    if (w<h)
      {
        var imageWidth = 380;
        var imageHeight = Math.floor(w*(380/h))
      }
    else
      {
        var imageHeight = 380;
        var imageWidth = Math.floor(h*(380/w))
      }
    
    var resizeRes = 72
    var resizeMethod = ResampleMethod.BICUBIC;
    
    //resize
    srcDoc.resizeImage(imageWidth, imageHeight, resizeRes, resizeMethod)
    
    // adjust canvas size
    srcDoc.resizeCanvas(400, 400, AnchorPosition.MIDDLECENTER);