使用 jimp 将项目推送到数组的“意外文件结尾”

乔史蒂文斯

我正在尝试将多个图像叠加到一个图像上。它在一定程度上有效,但它没有按照我想要的方式工作。

global.images = [];

fs.readdirSync('./images').forEach(function(file) {
    images.push(file);

    if (debug) {
        console.log(chalk.green('[Debug] Pushed ' + chalk.blue(file) + ' to the array.'));
    }
});
executeEdit(images);

function executeEdit(list) {
    var jimps = [];
    var x = 0;

    for (var i = 0; i < images.length; i++) {
        x = x + 150;

        setTimeout((function(i) {
            return function() {
                jimps.push(jimp.read('images/' + images[i]));
            }
        })(i), 10 * x);
    }

此代码引发以下错误: (node:15352) UnhandledPromiseRejectionWarning: Error: unexpected end of file at Inflate.zlibOnError (zlib.js:153:15) at Inflate._processChunk (D:\ImageTest\node_modules\pngjs\lib\sync-inflate.js:110:28) at zlibBufferSync (D:\ImageTest\node_modules\pngjs\lib\sync-inflate.js:151:17) at inflateSync (D:\ImageTest\node_modules\pngjs\lib\sync-inflate.js:155:10) at module.exports (D:\ImageTest\node_modules\pngjs\lib\parser-sync.js:79:20) at Object.exports.read [as image/png] (D:\ImageTest\node_modules\pngjs\lib\png-sync.js:10:10) at Jimp.parseBitmap (D:\ImageTest\node_modules\@jimp\core\dist\utils\image-bitmap.js:117:53) at Jimp.parseBitmap (D:\ImageTest\node_modules\@jimp\core\dist\index.js:498:32) at D:\ImageTest\node_modules\@jimp\core\dist\index.js:440:15 at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:511:3) (node:15352) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)

我不知道为什么。这可能是由于从目录中读取并将其添加到数组中,因为var images = ['file.png', 'file2.png' ]工作正常。

如果有人对如何修复有任何想法,请告诉我。

谢谢!

编辑:这样做有效,但它只选择最后一个图像而不是任何其他图像:/

for (var i = 0; i < images.length; i++) {
        x = x + 150;
        // console.log(i);

        var image = {
            _integer: i,
            _image: images[i],
            func: function() {
                jimps.push(jimp.read('images/' + this._image));
                // console.log(this._integer);
            }
        }

        setTimeout(function() {image.func()}, x);
    }

提示是消息UnhandledPromiseRejectionWarning:您错过了jimp实际异步的事实(回调或承诺)。在您的情况下,由于没有传递给jimp.read()它的回调假定使用了承诺,但您没有正确使用它们。

如果您替换// console.log(this._integer);console.log(jimps),您将看到如下内容:

[ Promise { <pending> } ]
[ Promise { <Jimp 32x32> }, Promise { <pending> } ]
.... 

我完全不知道你在用jimps数组做什么(也不知道你为什么在setTimeout()这里使用 a ),但你也许可以做这样的事情(如果通过删除一些日志和删除setTimeout()内容来简化一下)。这是现在正确的承诺代码。

var fs = require('fs');
var jimp = require('jimp');

const images = [];
fs.readdirSync('./images').forEach(function(file) {
    images.push(file);
    console.log('[Debug] Pushed', file, ' to the array');
});

executeEdit(images);
console.log('waiting for executeEdit() to terminate');

function executeEdit(list) {
  let jimp_read_promises = []

  for (var i = 0; i < images.length; i++) {
      jimp_read_promises.push( jimp.read('images/' + images[i]))
  }

  Promise.all(jimp_read_promises).then( loadedimgs => {
    loadedimgs.map( img => {
      console.log( img )
    })
  })
}

所以这将打印以下内容

[Debug] Pushed 7035a55d06033e435be112c0969b1820.png  to the array
[Debug] Pushed aa5ef861d490a11fe20806e83c6dc64b.png  to the array
[Debug] Pushed crayon.png  to the array
waiting for executeEdit() to terminate
<Jimp 32x32>
<Jimp 48x48>
<Jimp 256x256>

因此,同步读取 3 个文件(在我的情况下)然后调用 executeEdit()。我们构建了一个 promise 对象的数组,然后调用 Promise.all() ,它会等到所有的 promise 都得到解决。该值loadedimgs是一个包含每个承诺结果的数组(与承诺的顺序相同)。然后,您可以根据需要遍历该数组(这里我使用了一个map调用,但是 for 循环就可以了。

我希望这有帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将Jimp图像转换为Tensor node.js

来自分类Dev

尝试在NodeJS中使用Jimp(Express)从Multer上传多个图像时出现问题

来自分类Dev

如何使用Jimp调整要上传的图像的大小而无需在Node.js中刷新

来自分类Dev

如何将jimp对象转换为节点中的图像缓冲区?

来自分类Dev

在JavaScript中使用for循环将项目推送到Map上可以反转数组的顺序

来自分类Dev

尝试使用 perl 将日志文件推送到数组并处理文件

来自分类Dev

将已检查项目的详细信息推送到数组,并使用vuejs根据选中/取消选中更新数组

来自分类Dev

使用MongoDB的NodeJS-将项目推送到Github

来自分类Dev

使用EGit将Eclipse项目推送到GitHub

来自分类Dev

使用codeigniter php将数据推送到数组中

来自分类Dev

使用querySelectorAll后无法将元素推送到数组

来自分类Dev

使用php将键值推送到空数组中

来自分类Dev

如何使用Ajax将数据推送到数组

来自分类Dev

如何使用while循环PHP将数据推送到数组

来自分类Dev

如何使用 PHP 将现有值对推送到数组?

来自分类Dev

使用大括号将元素推送到 JSON 数组

来自分类Dev

将Jekyll项目推送到gh-pages远程分支并使用jekyll-compass时找不到CSS文件

来自分类Dev

使用AWS将文件推送到桌面应用程序

来自分类Dev

适当使用卷-将文件推送到容器中?

来自分类Dev

使用Swift将声音文件推送到阵列

来自分类Dev

使用Java将JSON数据推送到文件

来自分类Dev

使用 Jenkins 文件将图像推送到 Openshift

来自分类Dev

使用Http推送到github项目

来自分类Dev

使用Http推送到github项目

来自分类Dev

如何使用 angular 或 javascript 将所有对象键推送到数组中的单独数组?

来自分类Dev

使用Javascript将数据推送到另一个数组中的数组

来自分类Dev

使用foreach将对象推送到数组

来自分类Dev

使用 v-model 推送到数组

来自分类Dev

如何使用TortoiseHg将项目拉入或推送到GitHub存储库?

Related 相关文章

  1. 1

    将Jimp图像转换为Tensor node.js

  2. 2

    尝试在NodeJS中使用Jimp(Express)从Multer上传多个图像时出现问题

  3. 3

    如何使用Jimp调整要上传的图像的大小而无需在Node.js中刷新

  4. 4

    如何将jimp对象转换为节点中的图像缓冲区?

  5. 5

    在JavaScript中使用for循环将项目推送到Map上可以反转数组的顺序

  6. 6

    尝试使用 perl 将日志文件推送到数组并处理文件

  7. 7

    将已检查项目的详细信息推送到数组,并使用vuejs根据选中/取消选中更新数组

  8. 8

    使用MongoDB的NodeJS-将项目推送到Github

  9. 9

    使用EGit将Eclipse项目推送到GitHub

  10. 10

    使用codeigniter php将数据推送到数组中

  11. 11

    使用querySelectorAll后无法将元素推送到数组

  12. 12

    使用php将键值推送到空数组中

  13. 13

    如何使用Ajax将数据推送到数组

  14. 14

    如何使用while循环PHP将数据推送到数组

  15. 15

    如何使用 PHP 将现有值对推送到数组?

  16. 16

    使用大括号将元素推送到 JSON 数组

  17. 17

    将Jekyll项目推送到gh-pages远程分支并使用jekyll-compass时找不到CSS文件

  18. 18

    使用AWS将文件推送到桌面应用程序

  19. 19

    适当使用卷-将文件推送到容器中?

  20. 20

    使用Swift将声音文件推送到阵列

  21. 21

    使用Java将JSON数据推送到文件

  22. 22

    使用 Jenkins 文件将图像推送到 Openshift

  23. 23

    使用Http推送到github项目

  24. 24

    使用Http推送到github项目

  25. 25

    如何使用 angular 或 javascript 将所有对象键推送到数组中的单独数组?

  26. 26

    使用Javascript将数据推送到另一个数组中的数组

  27. 27

    使用foreach将对象推送到数组

  28. 28

    使用 v-model 推送到数组

  29. 29

    如何使用TortoiseHg将项目拉入或推送到GitHub存储库?

热门标签

归档