GIFEncoder & Canvas - stream.on не является ошибкой функции - PullRequest
0 голосов
/ 02 апреля 2020

Я занимаюсь разработкой службы генератора изображений, которая позволит пользователям создавать изображения с эффектами и наложениями. Я пытаюсь создать Triggered Endpoint, который использует Canvas и GIFEncoder.

К сожалению, я получаю ошибку stream.on is not a function. У меня есть команда Triggered на моем Discord Bot, которая использует Canvas и GIFEncoder, и она отлично работает. Очевидно, это другой процесс на моем боте, но с использованием Express. Я не очень знаком с ним.

Вот индекс. js файл

const express = require('express');
const app = express();

const TriggeredEndpoint = require("./backend/generate/triggered")

function status(type, msg, res) {
  if (type === false) res.status(400);

  return res.json({sucess: type, message: msg});
}

function streamStatus(type, stream, res) {
  if (type === false) res.status(400);
  let data;

  stream.on("data", (b) => {
    res.write(b);
  });

  stream.on("end", () => {
    res.end();
  });
};

function isImage(link) {
  let type = link.substring(link.lastIndexOf('.') + 1);
  let isPNG = /(png)/gi.test(type); //eslint-disable-line
  if (!isPNG) return false;

  return true;
}

app.get('/api/triggered', async (req, res) => {
  if (!req.query.url) return status(false, 'No URL Provided', res);
  let check = await isImage(req.query.url);
  if (!check) return status(false, 'The Image Isnt Of The PNG Type.', res);
  let result = await TriggeredEndpoint(req.query.url);

  return streamStatus(result[0], result[1], res);
});

запущен. js файл

const { createCanvas, Image, loadImage, registerFont } = require("canvas");
const request = require('node-superfetch');
const GIFEncoder = require('gifencoder');
const { get } = require('node-superfetch');


module.exports = async function TriggeredEndpoint(image) {

  function streamToArray(stream) {
    if (!stream.readable) return Promise.resolve([]);
    return new Promise((resolve, reject) => {
        const array = [];
        function onData(data) {
            array.push(data);
        }
        function onEnd(error) {
            if (error) reject(error);
            else resolve(array);
            cleanup();
        }
        function onClose() {
            resolve(array);
            cleanup();
        }
        function cleanup() {
            stream.removeListener('data', onData);
            stream.removeListener('end', onEnd);
            stream.removeListener('error', onEnd);
            stream.removeListener('close', onClose);
        }
        stream.on('data', onData);
        stream.on('end', onEnd);
        stream.on('error', onEnd);
        stream.on('close', onClose);
    });
}

    const encoder = new GIFEncoder(256, 256);
    const canvas = new createCanvas(256, 256);
    const ctx = canvas.getContext('2d');
    const imgTitle = new Image();
    const imgTriggered = new Image();

    imgTitle.src = await get('https://i.imgur.com/HQJ09eD.png').then(x => x.body);
      imgTriggered.src = image

  const stream = encoder.createReadStream();
  encoder.start();
    encoder.setRepeat(0);
    encoder.setDelay(50);
    encoder.setQuality(200);

  const coord1 = [-25, -33, -42, -14];
    const coord2 = [-25, -13, -34, -10];

    for (let i = 0; i < 4; i++) {
        ctx.drawImage(imgTriggered, coord1[i], coord2[i], 300, 300);
        ctx.fillStyle = 'rgba(255 , 100, 0, 0.4)';
        ctx.drawImage(imgTitle, 0, 218, 256, 38);
        ctx.fillRect(0, 0, 256, 256);
        encoder.addFrame(ctx);
    }

  encoder.finish();

    const resimage = streamToArray(stream).then(Buffer.concat);

    return [
      true,
       resimage
      ];
  }

Сработал. js код аналогичен коду моей команды Discord Bot Triggered, он работает нормально, просто я не могу заставить его работать над моим проектом Image Gen API.

Если я помогу, я был бы признателен .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...