X轴随GD旋转

问题描述 投票:0回答:1

我尝试从数据库生成 JPEG 文件,其中包含位于容器中的元素,其中包含坐标 (x,y)、大小 (w/h)、x 轴角度和纹理图像。

我在服务器(apache2)和php8上安装了GD扩展。

我知道 imagerotate() 函数,但它仅适用于 Z 轴(根据我的理解)。

所以我的问题是:是否还有其他函数允许在 X 轴上使用 GD 旋转图像?

php rotation gd
1个回答
0
投票

根据我的理解,这是 Skew-Y 的等价物。 Imagick 有这个功能,但是如果有人想在没有 Imagick 的情况下实现这个功能,你可以尝试这个。

这是我的带有 X 角度和 Y 角度参数的通用倾斜代码。

$srcFile = '1.jpg';
$dstFile = '1-Skew.png';

$src = imagecreatefromstring(file_get_contents($srcFile));

$dst = skewImage($src, 0, 10);

imagepng($dst, $dstFile);


function skewImage($src, $angleX = 0, $angleY = 0, $fillColor = null) {
    $width = imagesx($src);
    $height = imagesy($src);
    $slopeX = tan($angleX * pi() / 180);
    $slopeY = tan($angleY * pi() / 180);
    $dstWidth = $height * $slopeX + $width;
    $dstHeight = $width * $slopeY + $height;

    $dst = ImageCreateTrueColor($dstWidth, $dstHeight);
    imagealphablending($dst, false);
    if (is_null($fillColor)) {
        $transparency = imagecolorallocatealpha($dst, 0, 0, 0, 127);
        imagefill($dst, 0, 0, $transparency);
    } else if (strlen($fillColor) == 7) {
        list ($r, $g, $b) = sscanf($fillColor, "#%02x%02x%02x");
        $bkColor = imagecolorallocate($dst, $r, $g, $b);
        imagefill($dst, 0, 0, $bkColor);
    }

    for($x = 0; $x < $width; ++$x) {
        for($y = 0; $y < $height; ++$y) {
            $rgb = imagecolorat($src, $x, $y);
            imagesetpixel($dst, $y * $slopeX + $x, $x * $slopeY + $y, $rgb);
        }
    }

    imagesavealpha($dst, true);
    return $dst;
}

额外的空间可以用任何颜色填充(...,$fillColor = '#FFFFFF'),也可以是透明的(...,$fillColor = null)。

如有需要请随时沟通

© www.soinside.com 2019 - 2024. All rights reserved.