所以我终于得到了这个工作。似乎无法直接使用 ImageMagick 进行操作,因此最终操作了实际的 SVG 数据。
首先是找到对象的边界。使用 PHP 和 simpleXml 我将 SVG 数据转换为数组以便于操作/遍历。
似乎所有坐标都采用 xy 的形式,因此这会将坐标分解为数字,并在 x / y 记录之间切换(如果其高于/低于先前的值)。
/** $line is a <g> object */
protected function _position($line, &$position) {
if(empty($line['@d'])) {
if(is_array($line)) {
foreach($line as $l) {
self::_position($l, $position);
}
return;
}
}
if(empty($position)) {
$position = array(
'min' => array(
'x' => null,
'y' => null
),
'max' => array(
'x' => null,
'y' => null
)
);
}
foreach(array_filter(preg_split('/([a-z])/i', $line['@d'])) as $cord) {
$coordinate = 'x';
foreach(explode(' ', $cord) as $value) {
if(empty($value)) {
continue;
}
if($position['min'][$coordinate] == null || $position['min'][$coordinate] > $value - 1) {
$position['min'][$coordinate] = $value;
}
if($position['max'][$coordinate] == null || $position['max'][$coordinate] < $value + 1) {
$position['max'][$coordinate] = $value;
}
$coordinate = ($coordinate != 'x') ? 'x' : 'y';
}
}
}
一旦你得到了最小/最大界限,我就找到了一个属性transform
,translate
它通过指定的 x,y 移动对象。所以只要拿走0 - $min
它就会被移动到0
它可能的位置0 - -10
或0 - 10
我所有的文件都没有属性,所以我只是简单地替换<g>
了<g transform="translate($widthOffset, $heightOffset)">
还要设置视图框大小:
$xml['svg']['@viewbox'] = sprintf('%s %s %s %s',
$position['min']['x'],
$position['min']['y'],
($position['max']['x'] - $position['min']['x']),
($position['max']['y'] - $position['min']['y'])
);
最后要做的就是将数组转换回 XML 并将新数据保存回文件中。