gpt4 book ai didi

php - 如何使用 PHP 调整 SVG 的大小?

转载 作者:行者123 更新时间:2023-12-05 00:13:13 29 4
gpt4 key购买 nike

我正在尝试在 PHP 脚本中调整(增加大小)SVG 的大小并将其另存为新的 SVG。鉴于 SVG 是由另一个脚本生成的。它包含图像和文本。

我试过 imagick ,但生成的 svg 已损坏,并且不包含任何内容。

这就是我所做的:

$image = new Imagick();
$image->setResolution(2000,2000);
$image->readImage('/pathe/to/my/svg.svg');
$image->scaleImage(1000,1000);
file_put_contents('/pathe/to/my/new.svg', $image->getImageBlob());

最佳答案

考虑到“SVG”代表“可伸缩矢量图形”。

  • Imagick 是一个用于处理面向像素的图形的库,因此不适合 SVG 等矢量图形格式。
  • SVG 本质上是可扩展的。在大多数情况下,您不需要重写它们来更改它们的大小。如果您在网页中显示 SVG(通过 <img><object> 标签,或作为 CSS background-image ,它将以为这些元素定义的大小显示,并且如果有大小信息存储在 SVG 文件中,这将被简单地忽略。(请注意,许多 SVG 文件根本不包含显示大小信息。)
  • 您可能需要在 SVG 文件中设置大小信息的唯一情况是将其显示为独立文件(例如,如果您有一个指向 .svg 本身的链接)。

    在这种情况下,您可以利用 SVG 是 XML 文件这一事实:
    $dom = new DOMDocument('1.0', 'utf-8');
    $dom->load('/pathe/to/my/svg.svg');
    $svg = $dom->documentElement;

    if ( ! $svg->hasAttribute('viewBox') ) { // viewBox is needed to establish
    // userspace coordinates
    $pattern = '/^(\d*\.\d+|\d+)(px)?$/'; // positive number, px unit optional

    $interpretable = preg_match( $pattern, $svg->getAttribute('width'), $width ) &&
    preg_match( $pattern, $svg->getAttribute('height'), $height );

    if ( $interpretable ) {
    $view_box = implode(' ', [0, 0, $width[0], $height[0]]);
    $svg->setAttribute('viewBox', $view_box);
    } else { // this gets sticky
    throw new Exception("viewBox is dependent on environment");
    }
    }

    $svg->setAttribute('width', '1000');
    $svg->setAttribute('height', '1000');
    $dom->save('/pathe/to/my/new.svg');

    如果元素没有 viewBox,会有一些棘手的情况。属性和宽度和高度具有非像素单位。处理它们需要对 SVG 有更深入的了解。最好确保“其他脚本”生成的 SVG 文件始终具有 viewBox .然后可以省略条件部分。

    术语“分辨率”不适用于矢量图形。宽度和高度可以是无量纲的数字(代表用于渲染到输出设备的像素,例如屏幕),或任何有效的 CSS 长度单位:em、ex、px、pt、pc、cm、mm、in 和百分比。
  • 关于php - 如何使用 PHP 调整 SVG 的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48820832/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com