Я работаю с использованием Node и Discord.js, внося изменения в исходный код бота Discord для клиента. Поэтому я не смогу предоставить полные исходные файлы, поскольку подавляющее большинство кода не принадлежит мне, и я бы предпочел не выпускать код клиента на всякий случай - но я буду публиковать фрагменты, написанные мной. которые имеют отношение к вопросу.
Задача состоит в том, чтобы заставить бота сгенерировать изображение, выделяющее «ежедневные» предметы в игровом магазине Fortnite. По сути, это фоновое / шаблонное изображение, в котором изображения различных предметов магазина будут наложены на поля в шаблонном изображении. Чтобы добиться этого, я пытался использовать Jimp для манипуляции / генерации изображений. Однако я столкнулся со странной проблемой, которая, кажется, возникает только тогда, когда изображения получены из API, предоставляющего pngs элемента Fortnite.
Этот API-интерфейс возвращает (помимо прочего) URL-адрес изображения, который я изначально пытался использовать для чтения с Jimp. (Обратите внимание, что на самом деле я не могу предоставить какие-либо ссылки на документы API, поскольку он находится в закрытой бета-версии; у меня есть доступ к нему только потому, что клиент дал мне свой токен, чтобы я мог над ним поработать.) Jimp.read
предназначено для URL-адрес img, который он обрабатывает в образе Jimp - и это нормально работает, когда я использую URL-адрес изображения из любого другого источника . Тем не менее, при передаче ему URL из этого API, это вызывает исключение, которое console.log
s как:
AssertionError [ERR_ASSERTION]: zlib binding closed
(за ним следует оставшаяся часть трассировки стека, которую я опубликую в полном объеме ниже).
Я уже несколько часов бью головой об стену, пытаясь прорваться через это, Гугл, пытаясь найти обходные пути, пробовать альтернативные библиотеки, но до сих пор не смог никуда добраться. Я попытался загрузить изображение в буфер и подать , что в Jimp.read
, но получаю точно такую же ошибку, слово в слово. Попытался использовать конструктор new Jimp( ... )
, но все равно не работал.
Я также пытался найти ответ в Google, но ошибка zlib binding closed
кажется крайне необычной, и было очень мало упоминаний об этом в любом контексте, и никаких упоминаний об этом относительно Jimp, которые я смог найти. Погуглив "zlib binding closed" в кавычках, я получил только 19 результатов. Если больше ничего, если кто-нибудь знает, что означает эта ошибка , это помогло бы мне лучше понять, где ее можно исправить.
Я пытался найти альтернативы библиотеке Jimp, но что касается библиотек, управляющих изображениями JavaScript, Canvas API требует объект DOM и Caman, который я просто не смог установить.
Обычно я не спрашиваю о StackOverflow, но нигде не могу найти экземпляров этой проблемы. Возможные решения или даже просто объяснения того, что может означать ошибка, были бы чрезвычайно полезны, даже если у кого-то есть предложения относительно хорошей альтернативы Jimp в случае, если я не могу это исправить.
(Ниже приведены фрагменты кода / трассировки стека, я, вероятно, пропустил некоторые важные вещи, так как устал от работы над этим, и мне совершенно не по себе, поэтому дайте мне знать, если вам что-то еще понадобится от меня)
Попытка URL:
Jimp.read("https://image.fnbr.co/outfit/5b90ec38262b40c2dcc98379/icon.png")
.then(image => {
message.channel.send("jimp", {
file: image
});
})
.catch(err => {
console.log(err);
});") // Should just return a URL string
.then(image => {
message.channel.send("jimp", {
file: image
});
})
.catch(err => {
console.log(err);
});
Попытка буфера:
request.get("https://image.fnbr.co/outfit/5b90ec38262b40c2dcc98379/icon.png", function(error, response, body) {
if (!error && response.statusCode == 200) {
var buffer = new Buffer(body);
Jimp.read(buffer)
.then(image => {
message.channel.send("jimp", {
file: image
});
})
.catch(err => {
console.log(err);
});
} else {
console.log("8(");
}
});
^ В конечном итоге вышеизложенное будет получать URL-адреса изображений на основе «ежедневных» результатов из магазина, но сейчас я просто пытаюсь заставить их работать с жестко закодированным URL-адресом. Все URL этого API имеют тот же формат, что и используемый здесь.
Полный console.log(err)
Выход на консоль:
{ AssertionError [ERR_ASSERTION]: zlib binding closed
at Inflate._processChunk (C:\Users\(user)\Documents\dev\(project)\node_modules\pngjs\lib\sync-inflate.js:108:3)
at zlibBufferSync (C:\Users\(user)\Documents\dev\(project)\node_modules\pngjs\lib\sync-inflate.js:151:17)
at inflateSync (C:\Users\(user)\Documents\dev\(project)\node_modules\pngjs\lib\sync-inflate.js:155:10)
at module.exports (C:\Users\(user)\Documents\dev\(project)\node_modules\pngjs\lib\parser-sync.js:79:20)
at Object.exports.read [as image/png] (C:\Users\(user)\Documents\dev\(project)\node_modules\pngjs\lib\png-sync.js:10:10)
at Jimp.parseBitmap (C:\Users\(user)\Documents\dev\(project)\node_modules\@jimp\core\dist\utils\image-bitmap.js:117:53)
at new Jimp (C:\Users\(user)\Documents\dev\(project)\node_modules\@jimp\core\dist\index.js:425:32)
at _construct (C:\Users\(user)\Documents\dev\(project)\node_modules\@jimp\core\dist\index.js:100:393)
at C:\Users\(user)\Documents\dev\(project)\node_modules\@jimp\core\dist\index.js:885:5
at Promise (<anonymous>)
generatedMessage: false,
name: 'AssertionError [ERR_ASSERTION]',
code: 'ERR_ASSERTION',
actual: undefined,
expected: true,
operator: '==',
methodName: 'constructor' }
Управление пакетами с помощью npm, запущенных с компьютера Windows.