javascript - 将PNG文件转换为不带标题的位图
问题描述
我需要为 Arduino 设备(带电子墨水显示屏)准备一个位图源流。数据来自 PNG 文件。我需要一个没有标题的“原始”图像数据。图像的每个像素只有 1 和 0(屏幕上的黑色或白色像素)。不幸的是,我不知道如何删除标题并将 PNG 文件转换为位图。这是我现在使用的代码(NodeJS):
const http = require('http');
const fs = require('fs');
const server = http.createServer(function(req, res) {
res.setHeader('content-type', 'application/octet-stream');
fs.readFile('sample.png', function(err, data) {
res.end(data);
});
});
server.listen(3000);
当我使用 BMP 文件作为源时,它几乎可以正常工作,但我需要使用 PNG 文件。
这是我在 Arduino 上读取流的方式:
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
ESP8266WiFiMulti WiFiMulti;
#include <GxEPD.h>
#define ROTATION 1
#include <GxGDEW0583T7/GxGDEW0583T7.cpp>
#include <GxIO/GxIO_SPI/GxIO_SPI.cpp>
#include <GxIO/GxIO.cpp>
GxIO_Class io(SPI, 5, 0, 2);
GxEPD_Class display(io, 2, 12);
#define X_RES 448
#define Y_RES 600
void displayImage() {
uint32_t cursor = 0;
uint8_t eightPixels;
boolean initialized = false;
int len = http.getSize();
uint8_t buff[256] = { 0 };
WiFiClient * stream = http.getStreamPtr();
while(http.connected() && (len > 0 || len == -1)) {
size_t size = stream->available();
if(size) {
int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size));
for (int offset = 0; offset < c; offset++) {
if (!initialized) {
initialized = true;
display.init();
display.setRotation(1);
}
eightPixels = buff[offset];
if (cursor < X_RES*Y_RES) {
for (uint8_t i = 0; i < 8; i++) {
if ((eightPixels >> (7-i)) & 0x01){
display.drawPixel((cursor+i)%X_RES, (cursor+i)/X_RES, GxEPD_BLACK);
}
}
cursor+=8;
}
}
if(len > 0) {
len -= c;
}
}
delay(1);
}
display.update();
}
}
如果您能以某种方式帮助我,我将不胜感激。
解决方案
推荐阅读
- java - 使用 NetBeans 11.0 生成 .JAR 文件
- html - 是否可以真正禁用现代浏览器密码字段的自动填充和自动完成功能?
- visual-studio - VSCode 中的 Royale 设置
- wpf - WPF“'Grid'类型的值无法转换为'Control'
- php - 插入或删除时与 PDO 的 DB2 连接引发一般错误 -7008
- python - 如何使用python将文件附加到文件的开头,seek(0,0)不起作用
- dart - 转换流
> 流式传输 - c# - 如何将对象列表分组到字典中?
- php - ubuntu 14.04 nginx php5-fpm 大文件上传问题
- javascript - 试图从数组中生成所有排列,但只得到一个小子集