2013-02-22 64 views
0

我想解析Arduino上的XBM位圖,根本沒有運氣(期望< 16x16位圖)。經過大量的搜索,研究和修補,我已經達到了這個功能。我確定我正確地閱讀了字節(測試),但轉換有問題。在Arduino上繪製XBM位圖

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
msb = 1 << (w - 1); 
[snip] 
if (dots & (msb >> col)) 

該邏輯僅當w小於16

EDIT工作。

其實,這是需要修復的部分。的確,您將使用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(""); 
    } 
} 

我沒有嘗試過這一點,有一些細節與索引內存和位移位取的。祝你好運。