svg - 如何在 PHP 中使用 imageMagick 从 svg 路径数组中绘制图像
问题描述
我正在开发一个允许用户设计名片的网络项目。我在 Codeigniter 中使用 Fabric js 库,我正在将 Canvas 转换为 JSON 以使用 imageMagick 创建图像,并且我能够在设计中仅使用图像时打印图像,但是当我在画布中使用 svg 字符串并转换时到 json ,我正在获取这些数据而且我不知道如何使用 imageMagick 从这些数据中创建图像。请帮忙。
stdClass Object
(
[type] => path
[version] => 2.3.6
[originX] => left
[originY] => top
[left] => 460.41162159184
[top] => 201.78296829576
[width] => 6.04
[height] => 7.7
[fill] => rgb(0,0,0)
[stroke] =>
[strokeWidth] => 1
[strokeDashArray] =>
[strokeLineCap] => butt
[strokeLineJoin] => miter
[strokeMiterLimit] => 10
[scaleX] => 1
[scaleY] => 1
[angle] => 0
[flipX] =>
[flipY] =>
[opacity] => 1
[shadow] =>
[visible] => 1
[clipTo] =>
[backgroundColor] =>
[fillRule] => nonzero
[paintFirst] => fill
[globalCompositeOperation] => source-over
[transformMatrix] =>
[skewX] => 0
[skewY] => 0
[path] => Array
(
[0] => Array
(
[0] => M
[1] => 466.95
[2] => 203.98
)
[1] => Array
(
[0] => c
[1] => -2.17
[2] => 1.5
[3] => -1.59
[4] => 5.74
[5] => -5
[6] => 6
)
[2] => Array
(
[0] => c
[1] => -1.37
[2] => -1.29
[3] => -0.99
[4] => -4.34
[5] => -0.99
[6] => -7
)
[3] => Array
(
[0] => C
[1] => 464
[2] => 201.73
[3] => 464.84
[4] => 202.22
[5] => 466.95
[6] => 203.98
)
[4] => Array
(
[0] => z
)
)
)
这是 JS 代码,将设计发布到 PHP ImageMagick
savePNG : function(e) {
savedCanvas[getItem('activeView')] = canvas.toJSON();
var datas = JSON.stringify(savedCanvas);
$.ajaxSetup({
beforeSend: function(){
show_loader('show');
},
});
$.post('studio/api/save', {csrf_token_name:token,designs:datas} ).done( function(data){
console.log(data);
}).always( function(){
show_loader('hide');
})
return false;
},
解决方案
对于路径、矩形、圆形等图形元素,您可以使用 toSVG 方法。重写 toObject 方法并将 svg 参数放在那里。
toObject : function( propertiesToInclude ) {
var o = extend( this.callSuper( 'toObject', ['sourcePath', 'pathOffset'].concat( propertiesToInclude ) ), {
svg : this.toSVG()
} );
return o;
},
之后,您在 php.ini 中有 svg 元素。尝试使用该内容创建一个空的 svg 文件。之后,您可以将其用作图像或图形元素(我的建议是用作图形元素,因为结果是矢量形状)
更新
从 fabric.Object 扩展 toObject 方法
//rewrite core
fabric.Object.prototype.toObject = (function (toObject) {
return function () {
return fabric.util.object.extend(toObject.call(this), {
svgString: this.toSVG()
});
};
})(fabric.Object.prototype.toObject);
推荐阅读
- sql - 为什么我们不能使用减号关键字而不是减号
- java - 在openjdk中,安全策略没有生效
- html - 识别在 WSGI-Python 中从 HTML 中按下了哪个按钮(没有任何像烧瓶和 Django 这样的框架)?
- c# - C#,忽略 XML 反序列化的大小写敏感
- regex - 为不包括子文件夹的图像文件更正 nginx 规则
- python - 如何在pyspark中使用等效的熊猫轴来删除列而不是行?
- c++ - 为什么返回没有按预期工作给一些随机字符串
- react-native - 客户购买时是否有奖励积分的反应本机代码?
- php - 如何获取用户上次登录信息并将电子邮件发送到上次登录提醒?
- c# - 如何修复 .Net 运行时未处理的异常