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 に答える