krak/svg

用于操作和创建 SVG 的库

v0.3.1 2017-04-26 18:24 UTC

This package is auto-updated.

Last update: 2024-09-18 17:02:07 UTC


README

Krak Svg 是一个用于创建和导出 SVG 的库。

安装

{
    "require": {
        "krak/svg": "^0.2"
    }
}

设计 & 使用

SVG 库被拆分为几个组件:访问者、迭代器、序列化和元素。

构建 SVG 树

<?php
$svg = new Krak\Svg\Element\Svg();
$svg->getAttributes()
    ->setWidth(320)
    ->setHeight(320)
    ->setXmlns('http://www.w3.org/2000/svg')
    ->setAttribute(
        new Krak\Element\SimpleAttribute(
            'xmlns:xlink',
            'http://www.w3.org/1999/xlink'
        )
    );

$group = new Krak\Svg\Element\Group();

$transform_attr = new Krak\Svg\Element\TransformAttribute();
$transform_attr->translate(30, 20);
$group->getAttributes()->setAttribute($transform_attr);

$rect = new Krak\Svg\Element\Rect();
$rect->setAttributes(krak\svg\element\attr_iter_to_col([
        'width' => 80,
        'height' => 80,
        'x' => 0,
        'y' => 0,
        'fill' => '#ffffff',
    ]));

$group->appendChild($rect);

$imagick = new Imagick('file.jpg');
$image = new Krak\Svg\Element\Image();
$image->getAttributes()
    ->setAttribute(
        krak_svg_image_attr(
            $imagick->getImageBlob(),
            'image/jpeg',
            true // base64 decode
        )
    )
    ->setX(0)
    ->setY(0);

$svg->appendChild($group);
$svg->appendChild($image);

序列化 SVG 树

<?php
$string_serializer = new Krak\Svg\StringSvgSerializer();
$png_serializer = new Krak\Svg\RsvgCliSvgSerializer($string_serializer);

$svg_string_data = $string_serializer->serializeSvg($svg);
$svg_png_data = $png_serializer->serializeSvg($svg);

StringSerializer 会将树导出为 SVG 树。

RsvgCliSvgSerializer 使用 rsvg 命令行工具将 SVG 导出为 png、pdf、ps 或 rsvg 支持的任何其他格式。此序列化器需要字符串序列化器将其转换为字符串。

迭代 SVG 树

<?php
foreach (krak\svg\iter_top_down($svg) as $depth => $el) {
    // ...
}
foreach (krak\svg\iter_bottom_up($svg) as $depth => $el) {
    // ...
}
/* the following are just aliases of what's above */
foreach (new Krak\Svg\TopDownIterator($svg) as $depth => $el) {
    // ..
}
foreach (new Krak\Svg\BottomUpIterator($svg) as $depth => $el) {
    // ..
}

我们目前支持两种类型的迭代器:自顶向下和自底向上。函数式迭代器作为迭代 SVG 树的生成器实现(与递归相反)。迭代器类只是围绕函数式迭代器生成器的包装器。

  • 自顶向下:从树的顶部开始,并在向下过程中输出。
  • 自底向上:从树的底部开始,首先打印最低节点,然后向上工作。

元素模型

元素模型由元素和属性组成。每个元素都有一个 AttributeCollection,可以包含属性。大多数属性只是 SimpleAttributes,但有一些特殊属性可以创建并按元素设置。

元素还可以有提示,这些提示是与元素关联的元数据。

访问者和遍历者

访问者和遍历者是在序列化之前修改 SVG 树的一种方法。

  • 属性字符串访问者:将元素的属性转换为字符串
  • 高度计算器访问者:通过计算所有子元素的高度来计算 SVG 元素的高度。它只对具有 Krak\Svg\Visitor\HeightCalculatorVisitor::HINT 查询提示的元素进行高度计算。