【问题标题】:PHP GD - How can I modify my Thumbnail Creator to crop portrait images from the center?PHP GD - 如何修改我的缩略图创建器以从中心裁剪肖像图像?
【发布时间】:2010-05-21 04:17:27
【问题描述】:

这是我当前的代码:

$image  = 'img.jpg';
$source = imagecreatefromjpeg($image);

list($origWidth, $origHeight) = getimagesize($image);

$imgH   = 75;
$imgW   = $origWidth / $origHeight * $imgH;
$thumb  = imagecreatetruecolor($imgW, $imgH);

imagecopyresampled($thumb, $source, 0, 0, 0, 0, $imgW, $imgH, $origWidth, $origHeight);

这允许我输出固定高度为 75 像素的图像。我想要做的是具有99x75 像素的恒定图像大小。不适合此的人像图像将从中心裁剪(因此原件的中心仍然是缩略图的中心 - 如果有意义的话)。

我该怎么做?

【问题讨论】:

    标签: php image gd crop


    【解决方案1】:

    嗯,这是纯粹的数学。您想要达到 99x75 的尺寸,并且只想从宽度上剪下来。所以首先,你调整大小以适应高度。这就是你所做的,但这样做是为了适应 75 的高度。将其切换为 99。然后检查宽度是否为

    if( $imgW > 75 )
    {
       $diff   = $imgw - 75; // this is what's extra
       $srcX   = ceil( $diff / 2 ); // this is where your img starts from
       $imgW   = 75;
    }
    imagecopyresampled($thumb, $source, 0, 0, $srcX, 0, $imgW, $imgH, $origWidth, $origHeight); // notice that src X changed accordingly.
    

    因此,如果第一次“调整大小”后的宽度为 100,而您想要 75,则计算 diff = 25,将其除以 2 并 ceil => 13,然后告诉 GD 函数开始复制图像从 13 开始,而不是 0,并且仍然保持 75 高度。这意味着它将从宽度 13 复制到宽度 88 => 中心。

    希望这是您想要的。 问候, 加布里埃尔

    【讨论】:

      【解决方案2】:
      define( 'THUMB_WIDTH',  99 );
      define( 'THUMB_HEIGHT', 75 );
      
      $image = imagecreatefromjpeg('img.jpg');
      $thumb = imagecreatetruecolor(THUMB_WIDTH, THUMB_HEIGHT);
      
      list($image_width, $image_height) = getimagesize($image);
      $x0 = ( $image_width  - THUMB_WIDTH  ) / 2;
      $y0 = ( $image_height - THUMB_HEIGHT ) / 2;
      imagecopy(
          $thumb,      // resource $dst_im
          $image,      // resource $src_im
          0,           // int $dst_x
          0,           // int $dst_y
          $x0,         // int $src_x
          $y0,         // int $src_y
          THUMB_WIDTH, // int $src_w
          THUMB_HEIGHT // int $src_h  
      );
      

      此代码使用imagecopy 函数从源图像复制 99x75px 区域。源宽度 - 99 / 2 返回开始复制的 x 坐标,源高度 - 75 / 2 返回 y 坐标。如果您有兴趣从任意大小的图像生成固定大小的缩略图,请查看this article

      【讨论】:

        【解决方案3】:

        (未经测试)

        define('THUMB_WIDTH', 99);
        define('THUMB_HEIGHT', 75);
        
        $image  = 'img.jpg';
        $source = imagecreatefromjpeg($image);
        $thumb  = imagecreatetruecolor(THUMB_WIDTH, THUMB_HEIGHT);
        
        $cutX = imagesx($source) > THUMB_WIDTH;
        $cutY = imagesy($source) > THUMB_HEIGHT;
        
        $source_x = $cutX ? imagesx($source) / 2 - (THUMB_WIDTH/2) : 0;
        $source_y = $cutY ? imagesx($source) / 2 - (THUMB_HEIGHT/2) : 0;
        $source_width = $cutX ? THUMB_WIDTH : imagesx($source);
        $source_height = $cutY ? THUMB_HEIGHT : imagesy($source);
        
        imagecopyresampled($thumb, $source, 0, 0, $source_x, $source_y, $source_width, $source_height, THUMB_WIDTH, THUMB_HEIGHT);
        

        【讨论】:

          猜你喜欢
          • 2011-11-16
          • 1970-01-01
          • 2012-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-11
          相关资源
          最近更新 更多