我正在尝试解析Arduino上的XBM位图,根本没有运气(期望< 16x16位图)。经过大量的搜索,研究和修补,我已经实现了这个功能。我确定我正在正确读取字节(测试过),但转换有问题。
void bitmap(int x, int y, uint16_t *bitmap, uint8_t w, uint8_t h) {
uint16_t dots, msb;
uint16_t col, row;
msb = 1 << (w - 1);
for (row = 0; row < h; row++) {
dots = pgm_read_word(bitmap + row);
//Serial.print(dots, HEX);
//Serial.println(" ");
for (col = 0; col < w; col++) {
if (dots & (msb >> col))
Serial.print("#"); //toolbox.setPixel(x, y, 1, false);
else
Serial.print("'"); //toolbox.setPixel(x, y, 0, false);
}
Serial.println("");
}
}
这是我试图展示的位图。它的大小为32x32像素。正确显示16x16或更低的图像。
// 32x32
uint16_t medium[] PROGMEM = {
0xffff, 0xffff, 0x0000, 0x8000, 0xffff, 0xffff, 0x0001, 0x0000, 0xffff,
0xffff, 0x0000, 0x8000, 0xffff, 0xffff, 0x0001, 0x0000, 0xffff, 0xffff,
0x0000, 0x8000, 0xffff, 0xffff, 0x0001, 0x0000, 0xffff, 0xffff, 0x0000,
0x8000, 0xffff, 0xffff, 0x0001, 0x0000, 0xffff, 0xffff, 0x0000, 0x8000,
0xffff, 0xffff, 0x0001, 0x0000, 0xffff, 0xffff, 0x0000, 0x8000, 0xffff,
0xffff, 0x0001, 0x0000, 0xffff, 0xffff, 0x0000, 0x8000, 0xffff, 0xffff,
0x0001, 0x0000, 0xffff, 0xffff, 0x0000, 0x8000, 0xffff, 0xffff, 0x0001,
0x0000 };
这是位图的PNG以供参考:
答案 0 :(得分:0)
msb = 1 << (w - 1);
[snip]
if (dots & (msb >> col))
此逻辑仅在w
小于16时有效。
编辑:回应评论。
实际上,这是需要修复的部分。你确实要使用uint16_t,但是你需要找到一种方法将16位整数转换成位流。现在,它仅在行正好为16位宽时才有效。
我会做一些事情来从流中获取下一位。我会使用一个变量来跟踪我在当前单词中的位置,然后在需要时使用另一个变量获取下一个单词。
void bitmap(int x, int y, uint16_t *bitmap, uint8_t w, uint8_t h) {
uint16_t dots = 0, current_mask = 0;
uint16_t col, row, next_word = 0;
for (row = 0; row < h; row++) {
for (col = 0; col < w; col++) {
current_mask >>= 1;
if (0 == current_mask) {
current_mask = 1 << 15;
dots = pgm_read_word(bitmap + next_word);
++next_word;
}
if (dots & current_mask)
Serial.print("#"); //toolbox.setPixel(x, y, 1, false);
else
Serial.print("'"); //toolbox.setPixel(x, y, 0, false);
}
Serial.println("");
}
}
我没有试过这个,并且索引内存和位移有一些细节。祝你好运。