Fabric.JS 和 Node.JS - 导出为 PNG/JPEG
Fabric.JS with Node.JS - Exporting as PNG/JPEG
所以我只是在 Fabric.JS Node.JS,而不是网络,我已经设法制作了静态 Canvas,然后在上面放一个矩形。导出时间。这是我创建 canvas 和添加矩形的代码:
var canvas = new fabric.StaticCanvas(null, {width: 200, height: 200})
var rect = new fabric.Rect({
left: 100,
top: 100,
width: 100,
height: 50,
fill: "red"
})
canvas.add(rect)
以下是我为导出图像所做的所有尝试:
//Creates a PNG file that isn't generated correctly. It's as if it's corrupt. No program can open it
canvas.createPNGStream().on("data", function (chunk) {
fs.createWriteStream(__dirname + "/output.png").write(chunk)
})
//Causes a crash
canvas.createJPEGStream().on("data", function (chunk) {
fs.createWriteStream(__dirname + "/output.jpeg").write(chunk)
})
Error:
C:\Users\me\Documents\my project\node_modules\canvas\lib\jpegstream.js:44
canvas[method](options.bufsize, options.quality, options.progressive, function(err, chunk){
^
TypeError: canvas[method] is not a function
at C:\Users\me\Documents\my project\node_modules\canvas\lib\jpegstream.js:44:19
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickCallback (internal/process/next_tick.js:180:9)
//Same thing as first try^^, except it's a JPEG
canvas.createJPEGStream({quality: 100}).pipe(fs.createWriteStream(__dirname + "/output.jpeg"))
//This one makes the PNG file, but when it's opened, its 100% transparent. That's it. The rectangle I added isn't there. Canvas size is correct, however
canvas.createPNGStream().pipe(fs.createWriteStream(__dirname + "/output.png"))
注意:fabric.Canvas(null, {width: 200, height: 200})
似乎也与 StaticCanvas
完全相同,在本例中为
注2:此代码:
var canvas = new fabric.createCanvasForNode(200, 200)
导致此错误:
var canvas = new fabric.createCanvasForNode(200, 200)
^
TypeError: fabric.createCanvasForNode is not a constructor
at Client.client.on.message (C:\Users\me\Documents\my project\index.js:31:14)
at emitOne (events.js:115:13)
at Client.emit (events.js:210:7)
at MessageCreateHandler.handle (C:\Users\me\Documents\my project\node_modules\discord.js\src\client\websocket\packets\handlers\MessageCreate.js:9:34)
at WebSocketPacketManager.handle (C:\Users\me\Documents\my project\node_modules\discord.js\src\client\websocket\packets\WebSocketPacketManager.js:103:65)
at WebSocketConnection.onPacket (C:\Users\me\Documents\my project\node_modules\discord.js\src\client\websocket\WebSocketConnection.js:330:35)
at WebSocketConnection.onMessage (C:\Users\me\Documents\my project\node_modules\discord.js\src\client\websocket\WebSocketConnection.js:293:17)
at WebSocketClient.internalOnMessage (C:\Users\me\Documents\my project\node_modules\uws\uws.js:103:17)
at native.client.group.onMessage (C:\Users\me\Documents\my project\node_modules\uws\uws.js:57:15)
我在这里遗漏了什么吗? None 这些方法似乎都有效,这是我在 Google 上所能找到的所有方法。导出图像的正确方法是什么?它可以是 PNG 或 JPEG/JPG,最好是 PNG,但 JPEG/JPG 也可以。真的是任何常见格式。
找到答案了。 canvas.createPNGStream().pipe(fs.createWriteStream(__dirname + "/output.png"))
确实有效。它完全为空的原因是因为它看起来 canvas.add()
不是一个即时动作。在输出文件之前,我所做的只是 setTimeout()
来解决这个问题。希望这对某人有所帮助!
我使用了 node-canvas
中的示例代码并且它有效
const fs = require('fs')
const out = fs.createWriteStream(__dirname + '/test.png')
const stream = canvas.createPNGStream()
stream.pipe(out)
out.on('finish', () => console.log('The PNG file was created.'))
所以我只是在 Fabric.JS Node.JS,而不是网络,我已经设法制作了静态 Canvas,然后在上面放一个矩形。导出时间。这是我创建 canvas 和添加矩形的代码:
var canvas = new fabric.StaticCanvas(null, {width: 200, height: 200})
var rect = new fabric.Rect({
left: 100,
top: 100,
width: 100,
height: 50,
fill: "red"
})
canvas.add(rect)
以下是我为导出图像所做的所有尝试:
//Creates a PNG file that isn't generated correctly. It's as if it's corrupt. No program can open it
canvas.createPNGStream().on("data", function (chunk) {
fs.createWriteStream(__dirname + "/output.png").write(chunk)
})
//Causes a crash
canvas.createJPEGStream().on("data", function (chunk) {
fs.createWriteStream(__dirname + "/output.jpeg").write(chunk)
})
Error:
C:\Users\me\Documents\my project\node_modules\canvas\lib\jpegstream.js:44
canvas[method](options.bufsize, options.quality, options.progressive, function(err, chunk){
^
TypeError: canvas[method] is not a function
at C:\Users\me\Documents\my project\node_modules\canvas\lib\jpegstream.js:44:19
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickCallback (internal/process/next_tick.js:180:9)
//Same thing as first try^^, except it's a JPEG
canvas.createJPEGStream({quality: 100}).pipe(fs.createWriteStream(__dirname + "/output.jpeg"))
//This one makes the PNG file, but when it's opened, its 100% transparent. That's it. The rectangle I added isn't there. Canvas size is correct, however
canvas.createPNGStream().pipe(fs.createWriteStream(__dirname + "/output.png"))
注意:fabric.Canvas(null, {width: 200, height: 200})
似乎也与 StaticCanvas
完全相同,在本例中为
注2:此代码:
var canvas = new fabric.createCanvasForNode(200, 200)
导致此错误:
var canvas = new fabric.createCanvasForNode(200, 200)
^
TypeError: fabric.createCanvasForNode is not a constructor
at Client.client.on.message (C:\Users\me\Documents\my project\index.js:31:14)
at emitOne (events.js:115:13)
at Client.emit (events.js:210:7)
at MessageCreateHandler.handle (C:\Users\me\Documents\my project\node_modules\discord.js\src\client\websocket\packets\handlers\MessageCreate.js:9:34)
at WebSocketPacketManager.handle (C:\Users\me\Documents\my project\node_modules\discord.js\src\client\websocket\packets\WebSocketPacketManager.js:103:65)
at WebSocketConnection.onPacket (C:\Users\me\Documents\my project\node_modules\discord.js\src\client\websocket\WebSocketConnection.js:330:35)
at WebSocketConnection.onMessage (C:\Users\me\Documents\my project\node_modules\discord.js\src\client\websocket\WebSocketConnection.js:293:17)
at WebSocketClient.internalOnMessage (C:\Users\me\Documents\my project\node_modules\uws\uws.js:103:17)
at native.client.group.onMessage (C:\Users\me\Documents\my project\node_modules\uws\uws.js:57:15)
我在这里遗漏了什么吗? None 这些方法似乎都有效,这是我在 Google 上所能找到的所有方法。导出图像的正确方法是什么?它可以是 PNG 或 JPEG/JPG,最好是 PNG,但 JPEG/JPG 也可以。真的是任何常见格式。
找到答案了。 canvas.createPNGStream().pipe(fs.createWriteStream(__dirname + "/output.png"))
确实有效。它完全为空的原因是因为它看起来 canvas.add()
不是一个即时动作。在输出文件之前,我所做的只是 setTimeout()
来解决这个问题。希望这对某人有所帮助!
我使用了 node-canvas
中的示例代码并且它有效
const fs = require('fs')
const out = fs.createWriteStream(__dirname + '/test.png')
const stream = canvas.createPNGStream()
stream.pipe(out)
out.on('finish', () => console.log('The PNG file was created.'))