PHP GD - 围绕任何给定点裁剪图像

Posted

技术标签:

【中文标题】PHP GD - 围绕任何给定点裁剪图像【英文标题】:PHP GD - crop image around any given point 【发布时间】:2014-09-15 13:33:09 【问题描述】:

我有以下脚本,使用 php 的 gd 在中心点成功裁剪和图像:

list($source_width, $source_height, $source_type) = getimagesize($img_path);

define('IMAGE_WIDTH', 200);
define('IMAGE_HEIGHT', 300);

$ratio = $source_width / $source_height;
$desired_aspect_ratio = IMAGE_WIDTH / IMAGE_HEIGHT;

if ($ratio > $desired_aspect_ratio) 
    $temp_height = IMAGE_HEIGHT;
    $temp_width = ( int ) (IMAGE_HEIGHT * $ratio);
 else 
    $temp_width = IMAGE_WIDTH;
    $temp_height = ( int ) (IMAGE_WIDTH / $ratio);


$x = ($temp_width - IMAGE_WIDTH) / 2;
$y = ($temp_height - IMAGE_HEIGHT) / 2;

$cropped = imagecreatetruecolor(IMAGE_WIDTH, IMAGE_HEIGHT);
imagecopy(
    $cropped,
    $temp,
    0, 0,
    $x, $y,
    IMAGE_WIDTH, IMAGE_HEIGHT
);

而不是这个为中心:

$x = ($temp_width - IMAGE_WIDTH) / 2;
$y = ($temp_height - IMAGE_HEIGHT) / 2;

在我的网站上,用户可以选择图像的“主要焦点”,我将在其中裁剪图像。焦点将以百分比形式提供。我已经有了供客户选择的百分比和方法,我只需要获取这些值并围绕它们进行裁剪。这可以做到吗?例如,如果我希望我的图像围绕点裁剪,如下图所示:

【问题讨论】:

您是在问 PHP 将如何围绕选定点进行裁剪,或者如何从用户那里获取要裁剪的位置? 我如何使用 PHP 围绕这一点进行裁剪。我已经准备好使用的存储位置 对于逻辑部分,您必须获取焦点的坐标,从中减去 100 并将其用作 x1/y1。对于 x2/y2,您也可以这样做,但这次不是减去 100,而是添加它。这是基本程序。您仍然需要检查图像边框和其他边缘情况。 @ThomasDavidPlat 谢谢。我正在尝试写出逻辑/公式,但似乎无法正确。我不确定您所说的 x1 和 x2、y1 和 y2 是什么意思? 换句话说:x1/y1是你开始裁剪过程的点,x2/y2减去x1/y2是你需要裁剪的宽度/高度 【参考方案1】:

下面的函数应该做你想做的。

仅传递第一个参数将输出您现在拥有的内容:源图像的中间被裁剪为 200px/200px。 第二个和第三个参数允许您根据需要指定作物中心的 X/Y 百分比坐标。 第四个和第五个参数允许您设置裁剪图像的大小。

(请注意,这假设为 PNG,但如果需要,您应该能够轻松地将其调整为其他格式。)

function crop($file, $cropX = 50, $cropY = 50, $cropW = 200, $cropH = 200)

    $src = imagecreatefrompng($file);
    $dest = imagecreatetruecolor($cropW, $cropH);

    list($src_w, $src_h) = getimagesize($file);

    // calculate x/y coordinates for crop from supplied percentages.
    $src_x = (($src_w / 100) * $cropX) - ($cropW / 2);
    $src_y = (($src_h / 100) * $cropY) - ($cropH / 2);

    imagecopy($dest, $src, 0, 0, $src_x, $src_y, $src_w, $src_h);

    imagedestroy($src);

    return $dest;

使用示例(将 X 的裁剪焦点设置为 70%):

$img = crop('test.png', 70);
header('Content-type: image/png');
imagepng($img);
imagedestroy($img);

【讨论】:

以上是关于PHP GD - 围绕任何给定点裁剪图像的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP (GD) 进行图像裁剪

我需要一些帮助在 PHP (GD) 中裁剪图像

从中心 PHP 裁剪图像

PHP GD 三角形图像裁剪

PHP 使用 GD 创建动态图像

使用 php & gd; 进行图像浏览