javascript - 将图像的每个像素颜色转换为json

标签 javascript node.js

如何将图像中的每个像素颜色转换为 json 文件。 例如,我有一张 352x240 (240p) 的 Mario 图像,我不会抓取这张照片中的每个像素,获取其 RGB 值,然后将其从左到右、从上到下添加到 json 文件中。

enter image description here

(我认为你必须循环遍历图像的每个像素,你如何实现这一点?)

像这样:(我必须创建变量,以便我可以使用要求的 fs 来保存文件。)

    data: 
    [
        "0, 0, 0",
        "0, 0, 5"
    ]
};

保存后应如下所示:(String)

{"data":["0, 0, 0","0, 0, 5"]}

我现在的代码:

var getPixels = require("get-pixels")
var Jimp = require('jimp');
const fs = require("fs");

Jimp.read("240p.png", function (err, image) {
    var imgg = image.getPixelColor(1, 1); // For example I want to get pixel 1,1
    var imgg2 = Jimp.intToRGBA(imgg);

});

var obj = {
    data: 
    [
        "0, 0, 0",
        "0, 0, 5"
    ]
};
var filestring = JSON.stringify(obj);
var filename = "eek"
var file = filename
fs.access(file, fs.F_OK, (err) => {
    if (err) {
        console.log("Creating file.")
        fs.writeFile(filename, filestring, 'utf8', function (err){
            if (err) {
                return console.log("Something wen't wrong saving the file.")
            }
            console.log("File was successfully saved.")
        });
        return
    }
    console.log("File already exists.")
})

来源:get-pixels (获取图像大小) jimp (获取像素颜色)

最佳答案

这是我第一次使用 Nodejs 处理图像。这使用另一个 npm 包 pngjs 。希望这可以帮助您实现您想要做的事情!

var PNG = require('pngjs').PNG;
var fs = require("fs");

fs.createReadStream('240p.png').pipe(new PNG({ filterType: 4 })).on('parsed', () => {
    var pixels = [];
    for (var y = 0; y < this.height; y++) {
        for (var x = 0; x < this.width; x++) {
            var idx = (this.width * y + x) << 2;
            var r = this.data[idx];
            var g = this.data[idx + 1];
            var b = this.data[idx + 2];
            pixels.push(`${r}, ${g}, ${b}`);
        }
    }
    fs.writeFile('output.json', JSON.stringify({ data: pixels }), 'utf8', (err) => {
        if (err) {
            console.error(err)
        }
    });
});

更新(2019 年 11 月 10 日)

经过对 Jimp 的使用进行一些研究后,我成功地在不使用 pngjs 的情况下使其工作。包裹。这应该输出一个包含正确 RGB 数据的 JSON!

var Jimp = require("Jimp");
var fs = require("fs");

Jimp.read("240p.png")
  .then(image => {
    var width = image.bitmap.width;
    var height = image.bitmap.height;
    var pixels = [];
    for (var y = 0; y < height; y++) {
      for (var x = 0; x < width; x++) {
        var pixel = Jimp.intToRGBA(image.getPixelColor(x, y));
        pixels.push(`${pixel.r}, ${pixel.g}, ${pixel.b}`);
      }
    }
    fs.writeFile('output.json', JSON.stringify({ data: pixels }), 'utf8', (err) => {
        if (err) { throw err; }
    });
  })
  .catch(err => { throw err; });

更新 2(2019 年 11 月 10 日)

经过大量的尝试和错误,我终于得出了一个工作脚本,可以将 png 文件转换为二维 rgb 数组,并将二维 rgb 数组转换回 png 图像! 另请注意,我假设您正在尝试将 RGB 数据保存为二维数组,因为它非常重要,因为我们必须根据数组长度知道图像大小。

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

// Create two-dimensional pixels rgb array based on png image
Jimp.read('240p.png')
  .then(image => {
    var width = image.bitmap.width;
    var height = image.bitmap.height;
    var pixels = [];
    for (var y = 0; y < height; y++) {
      var rowPixels = [];
      for (var x = 0; x < width; x++) {
        var pixel = Jimp.intToRGBA(image.getPixelColor(x, y));
        rowPixels.push(`${pixel.r}, ${pixel.g}, ${pixel.b}`);
      }
      pixels.push(rowPixels);
    }
    fs.writeFile('INPUT_DATA.json', JSON.stringify({ data: pixels }), 'utf8', err => {
        if (err) { throw err; }
      }
    );
  })
  .catch(err => { throw err; });

// Create png image based on two-dimensional pixels rgb array
fs.readFile('INPUT_DATA.json', 'utf8', (err, file) => {
    if (err) { throw err; }
    var pixelsData = JSON.parse(file);
    var pixels = pixelsData.data;
    new Jimp(pixels[0].length, pixels.length, (err, image) => {
        if (err) { throw err; }
        pixels.forEach((rowPixels, y) => {
            rowPixels.forEach((pixel, x) => {
                var rgb = pixel.split(',');
                var r = Number(rgb[0]);
                var g = Number(rgb[1]);
                var b = Number(rgb[2]);
                var color = Jimp.rgbaToInt(r, g, b, 255);
                image.setPixelColor(color, x, y)
            })
        })
        image.write('OUTPUT_IMAGE.png', (err) => {
            if (err) { throw err; }
        });
    });
})

关于javascript - 将图像的每个像素颜色转换为json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58786689/

相关文章:

Javascript - 删除按钮和 parent

javascript - 空气日期选择器 js : hour+2

javascript - 如何在jQuery中查询匿名函数的多个条件或结果

javascript - JSON 问题以及在这个困惑中实现一些现有的 JavaScript

javascript - 如何使用 node.js 关闭与 cassandra 的连接

javascript - AngularJS 中 $location.path ("/home") 和 $location.$$path ="/home"之间的区别

node.js - 表达多个回调在 app.get 中的工作方式

node.js - Mocha 并非永远不会调用“then”函数进行断言检查

node.js - nodejs覆盖模块中的函数

node.js - 使用 node-soap 连接 Bing Ads API