【问题标题】:Reading binary data (pixel color) from a .bmp file in NodeJS从 NodeJS 中的 .bmp 文件读取二进制数据(像素颜色)
【发布时间】:2020-05-19 20:34:25
【问题描述】:

我正在尝试从2x2 bmp 文件(72 字节)中读取像素颜色 (RGB),其中第一个像素颜色为 #ffc90e

像素颜色(BGR)从位置62开始。

所以我尝试使用下面的代码从 nodeJS 获取像素颜色,但我得到了错误的十六进制值。我已经尝试将readFileSync 参数更改为binaryutf-8。使用 utf-8 会更接近但不准确。

'use strict'

const FS = require('fs') // https://nodejs.org/api/fs.html
process.chdir(__dirname)

var stream = new Buffer.from(FS.readFileSync('2x2.bmp', 'utf-8'))
console.log(stream)
console.log(stream.toJSON())

var blue = stream.toString('hex', 62, 63)
var green = stream.toString('hex', 64, 65)
var red = stream.toString('hex', 66, 67)

console.log(red, green, blue)

输出是:

如果我将readFileSync 参数更改为binaryutf-8,这可能会有所不同。但从未显示准确的值,尽管我可以使用十六进制编辑器@位置62(上图)看到它们。

参考资料:

https://nodejs.org/api/buffer.html

List of encodings that Node.js supports

更新

我尝试了不同的十六进制编辑器,它们都可以读取正确的二进制数据。只有 node.js 不能。即使this 普通的十六进制编辑器也能正确阅读,但 node.js 不能:

我打赌我所有的硬币都是 node.js 的问题。 (v12.16.2)

【问题讨论】:

  • 嗯,有趣的问题。在我想之前我做过类似的事情。我相信图像可以解析为字节数组,这可能是您想要的。我会多查一下,当我有更多细节时再回来。这可能是一个很好的起点developer.mozilla.org/en-US/docs/Web/JavaScript/…
  • @ZimriLeijen 我选择 .bmp 而不是其他格式的原因是因为可以直接读取位图文件中的像素颜色。在 jpeg 中,我必须使用库或其他东西。
  • @Azevedo 您仍然需要一个库,或者至少超出最基本的琐碎工作,因为位图(.bmp 文件格式)可以是各种类型的。有些使用索引颜色。而且,utf-8 绝对不是您想要的...这是二进制格式。你的截图是什么?
  • @Brad “可以是各种各样的”——在这种情况下不是。场景是原样的。不是各种.bmp,只是你可以在十六进制编辑器图片中看到的一种。
  • 嗯,我已经尝试过。我在这么多console.log() 之后得到的结论是 nodejs 的readFileSync() 在读取包含二进制数据的文件时存在一些问题。

标签: node.js binaryfiles


【解决方案1】:
const fs = require('fs');
fs.readFile('color.bmp', (err, data) => {
    console.log([...data])
})

输出:

[
  66, 77,  70,   0,   0,   0,   0,   0,   0,   0,  54,   0,
   0,  0,  40,   0,   0,   0,   2,   0,   0,   0,   2,   0,
   0,  0,   1,   0,  24,   0,   0,   0,   0,   0,  16,   0,
   0,  0, 195,  14,   0,   0, 195,  14,   0,   0,   0,   0,
   0,  0,   0,   0,   0,   0, 255, 255, 255, 255, 255, 255,
   0,  0,  14, 201, 255, 255, 255, 255,   0,   0
]

注意结尾处的 14、201、255。即对应ff, c9, 0e

对于 2x2 像素的图像,左上角的像素与您指定的相同为黄色,其余为白色。

你也可以使用这个模块https://www.npmjs.com/package/bmp-js

【讨论】:

  • 它确实有效!出于某种原因,Buffer 搞砸了,或者我搞砸了。
猜你喜欢
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
相关资源
最近更新 更多