从Center PHP裁剪图像
image-processing
php
7
0

我想从中心以200 * 130的大小来裁剪图像,要裁剪的图像可能会有所不同,如果图像较小,我们将不裁剪它,我知道如何在此部分可以检查图像的高度和图像,但是有点从图像的中间切入到裁切的东西中我无法弄清楚如何保持中心为裁切点,而不是向外裁切

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

GD与版本4.3.6及更高版本的所有PHP安装捆绑在一起,因此您很有可能拥有它。

这是您需要采取的步骤...

  1. 使用GD imagecreatefrom*()函数之一创建图像资源。您所使用的图像取决于要处理的图像类型
  2. 使用imagesx()imagesy()确定图像尺寸
  3. 使用以下算法确定裁切坐标,然后使用imagecopy()确定裁切坐标

查找作物坐标

$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');
收藏
评论

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

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

对准点

只需传递图像,所需的裁切尺寸以及两个轴上的对齐方式(您可以使用leftcenterrighttopmiddlebottomcropAlign该轴),即可进行cropAlign功能。

规格

描述

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失败,则返回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];
    }
}

用法示例

这是一些使用 犹他州茶壶 图像的作物示例。

$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'));

输入项

输入示例:犹他州茶壶

输出量

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

输出#1

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

输出#2

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

输出#3

收藏
评论

哎呀,你为什么要这么艰难?只需将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。您想要对宽度做同样的事情,只需遵循相同的步骤。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号