• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

чтение bmp столбиками на littleFS

Junkie

Member
Здравствуйте. как известно bmp файл пишется строка за строкой начиная с нижних строк к верхним, в случае 24бит формата это будут просто данные RGB и их легко считать.

C:
        uint32_t rsiz = w * 3;
        if (rsiz % 4 != 0) rsiz += 4 - (rsiz % 4); //выравниваем размер буфера до кратных 4
        char row[rsiz];
        
        f.seek(offset, SeekSet); //переходим на начало данных
        for (int j = 0; j < h; j++)
        {
            f.readBytes(row, rsiz); //читаем всю строку
            for (int i = 0; i < w; i++) //выводим на ленту
            {
                byte bB = row[i * 3];
                byte bG = row[i * 3 + 1];
                byte bR = row[i * 3 + 2];
                led_setpx(i, bR, bG, bB);
            }
        }
Я отображаю его на адресной ленте, все работает отлично, но картинки нужно заранее поворачивать боком, что лишняя морока, теперь пробуем прочесть файл по столбикам

C:
        for (int j = 0; j < w; j++)
            {
                for (int i = 0; i < h; i++)
                {
                    if (i == 0)
                        f.seek(h.offset + i * rsiz + j * 3, SeekSet);
                    else
                        f.seek(rsiz - 3, SeekCur);
                    uint8_t color[3];
                    f.read(color, 3);
                    led_setpx(i, color[2], color[1], color[0]);
                }
            }
теперь приходится скакать по строчкам с помощью f.seek, эта функция замедляет чтение почти в два раза.

Можно ли что-то придумать? может какую-нибудь хитрую буферизацию? правда памяти у esp8266 на такое не хватит.

У кого есть идеи?

Может пока не убежали считать соседний столбик в буфер, а потом на следующем шаге пока он отрисовывает читаем уже половинку следующего столбика, и после отрисовки придется дочитать только вторую половину, но затем опять понадобится вычитать сразу два
 

pvvx

Активный участник сообщества
Чтение Flash у ESP8266 достаточно быстрое и если bmp файл писать без всяких FS, а просто в кольцевые буфера, то скорости хватит с лихвой. Тем более читать Flash можно и через кэш, обычным memcpy(), но учесть align(4) и обращение по 4 байтам (32 битным словам). Тогда и не требуется сброс кэща после каждого обращения к Flash.
Всё это не относиться к Arduino. Там тяжелые процедуры чтения/записи Flash, да и прочего.
PS: вы боритесь с чужеродной системой, не годящейся для вашей задачи.
 

pvvx

Активный участник сообщества
Максимально что можно сделать в выбранной вами среде библиотек - писать файл в FS уже построчно, в нужном формате для последовательного чтения.
 

Junkie

Member
так и подумал, начал разбирать гиф формат, но чтоб хранить раскодированные данные не хватит озу, и хотел их сложить в отдельный файл в готовом на вывод виде, потом пришла идея так же и бмп файлы перебрать и сделать файлы с нужным порядком значений, флеш памяти достаточно чтобы уместить и гору картинок и их буферные файлы.
 
Сверху Снизу