2013-02-22 3 views
0

Я пытаюсь разобрать растровое изображение XBM на Arduino, не везет вообще (ожидайте < 16x16 растровых изображений). После долгих поисков, исследований и мастеринга я подошел к этой функции. Я уверен, что я правильно читаю байты (тестировал), но что-то не так с преобразованием.Рисование растровых изображений XBM на Arduino

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

Я не пробовал это, и есть некоторые детали, чтобы принять вместе с индексированием памятью и битным смещением. Удачи.

Смежные вопросы