从 PHP 中心裁剪图像

新手上路,请多包涵

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

原文由 June 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 395
2 个回答

从 4.3.6 版本开始,GD 与所有 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);

有人实现了一个方便的类,在这里封装了这个逻辑 ~ ImageManipulator.php

原文由 Phil 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

对准点

只需传递图像、所需的裁剪尺寸和两个轴上的对齐方式(您可以使用 left , center , right or top , middle , bottom from the axis) for the cropAlign function.

规格

描述

> cropAlign(resource $image, int $width, int $height, string $horizontalAlign = 'center', string $verticalAlign = 'middle')
>
> ```
>
> ### 参数
>
> - **`image`** :图像资源,由图像创建函数之一返回,例如 [`imagecreatetruecolor()`](https://secure.php.net/manual/en/function.imagecreatetruecolor.php) 。
> - **`width`** :最终裁剪图像的宽度。
> - **`height`** :最终裁剪图像的高度。
> - **`horizontalAlign`** :作物应沿水平轴对齐的地方。 Possible values are: `left` / `top` , `center` / `middle` , `right` / `bottom` 。
> - **`verticalAlign`** :作物应沿垂直轴对齐的地方。 Possible values are: `left` / `top` , `center` / `middle` , `right` / `bottom` 。
>
> ### 返回值
>
> 成功返回裁剪图像资源或 `FALSE` 失败。这来自 [`imagecrop()`](https://secure.php.net/manual/en/function.imagecrop.php) 。

## 源代码

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]; } }


## 用法示例

以下是一些使用 [犹他州茶壶](https://en.wikipedia.org/wiki/Utah_teapot) [图像](https://commons.wikimedia.org/wiki/File:Utah_teapot_simple_2.png) 的裁剪示例。

\(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’));


### 输入

[![输入示例:犹他茶壶](https://i.stack.imgur.com/NJcML.png)](https://i.stack.imgur.com/NJcML.png)

### 输出

cropAlign($im, 200, 250, ‘center’, ‘middle’)


[![输出 #1](https://i.stack.imgur.com/jEj9t.png)](https://i.stack.imgur.com/jEj9t.png)

cropAlign($im, 300, 150, ‘left’, ‘top’)


[![输出 #2](https://i.stack.imgur.com/lyjk1.png)](https://i.stack.imgur.com/lyjk1.png)

cropAlign($im, 1000, 250, ‘right’, ‘middle’) “`

输出 #3

原文由 totymedli 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏