だから私はついにこれを機能させました。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';
}
}
}
最小/最大境界を取得したら、指定された x、y でオブジェクトを移動するプロパティtransform
を見つけました。translate
そのため、取得するだけ0 - $min
で、そのままの状態に移動する0
か0 - -10
、0 - 10
<g>
すべてのファイルには with 属性がないため、 with を単純に置き換えるだけです<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 に変換し、新しいデータをファイルに保存します。