【发布时间】:2020-05-19 20:34:25
【问题描述】:
我正在尝试从2x2 bmp 文件(72 字节)中读取像素颜色 (RGB),其中第一个像素颜色为 #ffc90e:
像素颜色(BGR)从位置62开始。
所以我尝试使用下面的代码从 nodeJS 获取像素颜色,但我得到了错误的十六进制值。我已经尝试将readFileSync 参数更改为binary 和utf-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 参数更改为binary 或utf-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