【发布时间】:2017-01-09 15:38:09
【问题描述】:
我有一个简单的画布,我在上面添加形状(三角形、圆形、矩形)。我使用了支持 rgba 的光谱颜色选择器,并且我正在根据所选颜色设置形状的填充。至此,一切正常。现在我将画布导出为 JSON,
var json = JSON.stringify(canvas);
console.log(json);
此 JSON 输出稍后将保存到数据库中,但出于测试目的,我从控制台复制 json 并按如下方式使用它,
canvas.loadFromJSON('{"objects":[{"type":"circle","originX":"center","originY":"center","left":400,"top":200,"width":100,"height":100,"fill":{"_originalInput":{"h":"0%","s":"100%","v":"100%","a":0.13},"_r":255,"_g":0,"_b":0,"_a":0.13,"_roundA":0.13,"_format":"rgb","_ok":true,"_tc_id":3288},"stroke":{"_originalInput":{"h":"0%","s":"0%","v":"0%","a":1},"_r":0,"_g":0,"_b":0,"_a":1,"_roundA":1,"_format":"rgb","_ok":true,"_tc_id":3783},"strokeWidth":1,"strokeDashArray":null,"strokeLineCap":"butt","strokeLineJoin":"miter","strokeMiterLimit":10,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":0.4,"shadow":null,"visible":true,"clipTo":null,"backgroundColor":"","fillRule":"nonzero","globalCompositeOperation":"source-over","transformMatrix":null,"skewX":0,"skewY":0,"radius":50,"startAngle":0,"endAngle":6.283185307179586},{"type":"triangle","originX":"left","originY":"top","left":583,"top":89,"width":50,"height":50,"fill":{"_originalInput":{"h":"17.374213836477992%","s":"86.88524590163934%","v":"95.68627450980392%","a":0.34},"_r":235.01046366720004,"_g":243.98400000000004,"_b":32.01070080000003,"_a":0.34,"_roundA":0.34,"_format":"hex","_ok":true,"_tc_id":2503},"stroke":"rgb(0, 0, 0)","strokeWidth":6,"strokeDashArray":null,"strokeLineCap":"butt","strokeLineJoin":"miter","strokeMiterLimit":10,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"shadow":null,"visible":true,"clipTo":null,"backgroundColor":"","fillRule":"nonzero","globalCompositeOperation":"source-over","transformMatrix":null,"skewX":0,"skewY":0},{"type":"rect","originX":"left","originY":"top","left":485,"top":196,"width":50,"height":50,"fill":"#1d128f","stroke":null,"strokeWidth":1,"strokeDashArray":null,"strokeLineCap":"butt","strokeLineJoin":"miter","strokeMiterLimit":10,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":0.4,"shadow":null,"visible":true,"clipTo":null,"backgroundColor":"","fillRule":"nonzero","globalCompositeOperation":"source-over","transformMatrix":null,"skewX":0,"skewY":0,"rx":0,"ry":0}],"background":""}');
canvas.renderAll();
我面临的问题是,由于导出的 JSON 具有 rgba 值,因此当在画布上呈现形状时,填充为黑色。画布忽略了 JSON 字符串中存在的 rgba 值。
但是,当我使用以下 JSON 字符串(填充“绿色”和“红色”)时,形状会以绿色和红色呈现良好。
canvas.loadFromJSON('{"objects":[{"type":"rect","left":50,"top":50,"width":20,"height":20,"fill":"green","overlayFill":null,"stroke":null,"strokeWidth":1,"strokeDashArray":null,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"selectable":true,"hasControls":true,"hasBorders":true,"hasRotatingPoint":false,"transparentCorners":true,"perPixelTargetFind":false,"rx":0,"ry":0},{"type":"circle","left":100,"top":100,"width":100,"height":100,"fill":"red","overlayFill":null,"stroke":null,"strokeWidth":1,"strokeDashArray":null,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"selectable":true,"hasControls":true,"hasBorders":true,"hasRotatingPoint":false,"transparentCorners":true,"perPixelTargetFind":false,"radius":50}],"background":"rgba(0, 0, 0, 0)"}');
这是 fabric.js 中的错误还是我做错了什么?
【问题讨论】:
-
在您的 loadFromJSON 调用中,您似乎正在传递
fill一个对象。根据docs,我相信它需要某种颜色字符串。你可能想检查你的实现。 -
@Ben 我在这段代码中使用的 JSON 是由 Fabric.js 自己生成的。所以并不是我将 JSON 从另一个源加载到 Fabric.js 中。因此,如果 Fabric.js 已经导出了这个 JSON,那么它也应该能够加载它。如果 Fabric.js 不支持 hsv 和 rgba 那么为什么它在导出 JSON 时包含这些?
-
你有一个 jsfiddle 或其他东西可以看吗?
-
@Ben 我发现这不是 Farbic 的问题,而是我完整代码的问题。我在这里发布我的错误作为答案,所以如果有人像我一样犯了这个错误,就能解决这个问题。
标签: javascript fabricjs