0

我正在尝试在 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供参考:

4

1 回答 1

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("");
  }
}

我还没有尝试过,并且有一些关于索引内存和位移的细节。祝你好运。

于 2013-02-22T16:13:27.073 回答