我想从中心裁剪尺寸为 200 * 130 的图像 要裁剪的图像可能大小不同,如果图像较小我们不会裁剪它 我知道如何在这部分检查高度和图像但是有点陷入从图像中间裁剪的事情因为我无法弄清楚如何将中心保持为裁剪点而不是向外裁剪它
原文由 June 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想从中心裁剪尺寸为 200 * 130 的图像 要裁剪的图像可能大小不同,如果图像较小我们不会裁剪它 我知道如何在这部分检查高度和图像但是有点陷入从图像中间裁剪的事情因为我无法弄清楚如何将中心保持为裁剪点而不是向外裁剪它
原文由 June 发布,翻译遵循 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’) “`
原文由 totymedli 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答3.1k 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
1 回答1k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
3 回答1.2k 阅读
2 回答1.2k 阅读
1 回答1.2k 阅读
从 4.3.6 版本开始,GD 与所有 PHP 安装捆绑在一起,所以您很可能拥有它。
这是您需要采取的步骤…
imagecreatefrom*()
函数之一创建图像资源。您使用的那个取决于您正在处理的图像类型imagesx()
和imagesy()
确定图像尺寸imagecopy()
裁剪查找裁剪坐标
有人实现了一个方便的类,在这里封装了这个逻辑 ~ ImageManipulator.php