从中心PHP裁剪图像

时间:2011-07-31 18:15:38

标签: php image-processing

我想从中心裁剪尺寸为200 * 130的图像,要裁剪的图像尺寸可能会有所不同,如果图像较小我们不会裁剪它我知道如何在这个部位我可以检查高度和从图像的中间到图像中的一种图像 因为我无法弄清楚如何将中心保持为裁剪点而不是向外裁剪

4 个答案:

答案 0 :(得分:33)

GD捆绑了从4.3.6版本开始的所有PHP安装,所以很有可能,你有它。

以下是您需要采取的步骤......

  1. 使用GD imagecreatefrom*()函数之一创建图像资源。您使用的那个取决于您正在处理的图像类型
  2. 使用imagesx()imagesy()
  3. 确定图像尺寸
  4. 使用以下算法确定裁剪坐标,并使用imagecopy()
  5. 裁剪

    查找裁剪坐标

    $width  = imagesx($img);
    $height = imagesy($img);
    $centreX = round($width / 2);
    $centreY = round($height / 2);
    
    $cropWidth  = 200;
    $cropHeight = 130;
    $cropWidthHalf  = round($cropWidth / 2); // could hard-code this but I'm keeping it flexible
    $cropHeightHalf = round($cropHeight / 2);
    
    $x1 = max(0, $centreX - $cropWidthHalf);
    $y1 = max(0, $centreY - $cropHeightHalf);
    
    $x2 = min($width, $centreX + $cropWidthHalf);
    $y2 = min($height, $centreY + $cropHeightHalf);
    

    随意使用我的图像处理类,它应该使一些方面更容易 - https://gist.github.com/880506

    $im = new ImageManipulator('/path/to/image');
    $centreX = round($im->getWidth() / 2);
    $centreY = round($im->getHeight() / 2);
    
    $x1 = $centreX - 100;
    $y1 = $centreY - 65;
    
    $x2 = $centreX + 100;
    $y2 = $centreY + 65;
    
    $im->crop($x1, $y1, $x2, $y2); // takes care of out of boundary conditions automatically
    $im->save('/path/to/cropped/image');
    

答案 1 :(得分:5)

具有可配置对齐的图像裁剪

这是一个函数的原生实现(称为cropAlign),可以将图像裁剪到给定的宽度和高度,并且对齐到9个标准点(4个边,4个角) ,1个中心)。

Alignment points

只需传递图像,所需的裁剪尺寸以及两个轴上的对齐方式(您可以使用leftcenterrighttop,对于middle函数,bottomcropAlign无论如何都不在轴上)。

规范

  

描述

cropAlign(resource $image, int $width, int $height, string $horizontalAlign = 'center', string $verticalAlign = 'middle')
     

参数

     
      
  • image :图像资源,由其中一个图片创建功能返回,例如imagecreatetruecolor()
  •   
  • width :最终裁剪图片的宽度。
  •   
  • height :最终裁剪图片的高度。
  •   
  • horizontalAlign :裁剪应沿水平轴对齐的位置。可能的值包括:left / topcenter / middleright / bottom
  •   
  • verticalAlign :裁剪应沿垂直轴对齐的位置。可能的值包括:left / topcenter / middleright / bottom
  •   
     

返回值

     

成功时返回裁剪的图像资源,或者在失败时返回FALSE。这来自imagecrop()

源代码

function cropAlign($image, $cropWidth, $cropHeight, $horizontalAlign = 'center', $verticalAlign = 'middle') {
    $width = imagesx($image);
    $height = imagesy($image);
    $horizontalAlignPixels = calculatePixelsForAlign($width, $cropWidth, $horizontalAlign);
    $verticalAlignPixels = calculatePixelsForAlign($height, $cropHeight, $verticalAlign);
    return imageCrop($image, [
        'x' => $horizontalAlignPixels[0],
        'y' => $verticalAlignPixels[0],
        'width' => $horizontalAlignPixels[1],
        'height' => $verticalAlignPixels[1]
    ]);
}

function calculatePixelsForAlign($imageSize, $cropSize, $align) {
    switch ($align) {
        case 'left':
        case 'top':
            return [0, min($cropSize, $imageSize)];
        case 'right':
        case 'bottom':
            return [max(0, $imageSize - $cropSize), min($cropSize, $imageSize)];
        case 'center':
        case 'middle':
            return [
                max(0, floor(($imageSize / 2) - ($cropSize / 2))),
                min($cropSize, $imageSize),
            ];
        default: return [0, $imageSize];
    }
}

使用示例

以下是使用this imageUtah teapot的一些裁剪示例。

$im = imagecreatefrompng('https://i.stack.imgur.com/NJcML.png');
imagePng(cropAlign($im, 200, 250, 'center', 'middle'));
imagePng(cropAlign($im, 300, 150, 'left', 'top'));
imagePng(cropAlign($im, 1000, 250, 'right', 'middle'));

输入

Example input: Utah teapot

输出

cropAlign($im, 200, 250, 'center', 'middle')

Output #1

cropAlign($im, 300, 150, 'left', 'top')

Output #2

cropAlign($im, 1000, 250, 'right', 'middle')

Output #3

答案 2 :(得分:2)

Jeez,你为什么这么做?只需将x和y位置设置为裁剪量/ 2

即可
   $imageSize = getimagesize('thumbnail.png');

$croppedImage = imagecrop(imagecreatefrompng('thumbnail.png'), ['x' => 0, 'y' => ($imageSize[1]-$imageSize[0]*(9/16))/2, 'width' => $imageSize[0], 'height' =>  $imageSize[0]*(9/16)]);

注意我是如何使用我的$ imageSize [0] *(9/16),这是我在y方向上裁剪的数量,然后我从原始图像高度中减去找到裁剪量,然后除以2.如果你想对宽度做同样的事情,只需按照相同的步骤。

答案 3 :(得分:0)

这可能会对你有帮助。

function cropCentered($img, $w, $h)
{
  $cx = $img->getWidth() / 2;
  $cy = $img->getHeight() / 2;
  $x = $cx - $w / 2;
  $y = $cy - $h / 2;
  if ($x < 0) $x = 0;
  if ($y < 0) $y = 0;
  return $img->crop($x, $y, $w, $h);
}

我假设你正在使用GD库。 $ img是一个GD图像,$ w和$ h分别是你想要你的新图像的宽度和高度。在你的情况下,$ w = 200,$ h = 130。