цифровая электроника
вычислительная техника
встраиваемые системы

 
» » » Сжимаем RGB изображение, чтобы оно поместилось в Flash-память Arduino Uno


Сжимаем RGB изображение, чтобы оно поместилось в Flash-память Arduino Uno

Автор: Mike(admin) от 21-01-2022, 03:55

Большинство TFT-дисплеев поставляются с адаптером SD-карт, установленным на задней панели, но в некоторых случаях бывает необходимо обойтись без него. В таком случае когда вы захотите сохранить многоцветное растровое изображение в ограниченной FLASH-памяти, вы скоро превысите пределы ее размера. Даже небольшой 1,8-дюймовый дисплей предлагает разрешение 160 x 128 пикселей. Если вы выберете стандартный формат RBG, вам потребуется 61440 байт памяти.


Сжимаем RGB изображение, чтобы оно поместилось в Flash-память Arduino Uno

Даже с ATmega2560 вы столкнетесь с проблемами, поскольку массивы ограничены 32768 байтами. Посмотрев даташит на стандартный дисплей, вы можете обнаружить, что для каждого пикселя используется только два байта, что дает 5 бит для красного, 6 бит для зеленого и 5 бит для синего. Таким образом, если вы преобразуете файл растрового изображения таким образом, вам еще будет нужно 40960 байт. Вот почему в таких случаях требуется более сильное сжатие. Один из вариантов – предлагаемый в данном материале формат файла.


Сжимаем RGB изображение, чтобы оно поместилось в Flash-память Arduino Uno

Конечно, не существует графического программного обеспечения для преобразования данного изображения в этот формат, необходимо было написать специальное программное обеспечение. Здесь предоставлена версия на Паскале (Дельфи), вы можете легко конвертировать ее на ваш любимый язык.



procedure TForm1.Button1Click(Sender: TObject);
var f : file of byte;
    h : textfile;
    x, y  : integer;
    r, g, b, c, d : byte;
begin
if Opendialog1.Execute then
      begin
         AssignFile(F, OpenDialog1.FileName);
         Reset(F);
         seek(f,54);
         AssignFile(h, 'dest_332rgb.h');
         rewrite(h);
         x := 0;
         y := 125;
         while not eof(f) do
            begin
               read(f, b);
               read(f, g);
               read(f, r);
               Image1.Canvas.Pixels[x,y] := Rgb(r,g,b);
               c := (r and $E0) + (g and $E0 shr 3) + (b shr 6);
               write(h,c);
               write(h,',');
               x := x + 1;
               if x> 125 then
                  begin
                     x := 0;
                     y := y - 1;
                     read(f, d);
                     read(f, d);
                     write(h,#13);
                  end;
            end;
         closefile(f);
         closefile(h);
      end;
end;

Ограничения были установлены для изображения в квадрате размером 126x126 пикселей. Два фиктивных считывания ближе к концу будут необходимы, так как любая строка в файле BMP имеет число, кратное четырем байтам. Целевой файл будет содержать только сжатые данные без какой-либо заголовочной информации. На стороне Arduino вы должны распаковать данные. Просто переместите файл назначения в папку Arduino и используйте этот код.



const byte cs = 10;
const byte dc =  9;
const byte rst = 8;

#include <TFT.h>
TFT tft = TFT(cs, dc, rst);

const PROGMEM unsigned char rawData[] = {
#include "dest_332rgb.h"
};

void setup() {
  Serial.begin(115200);
  Serial.println("\n" __FILE__);
  tft.initR(2);
  tft.setRotation(3);
  tft.fillScreen(0);
  int w = tft.width();
  int h = tft.height();
  const word ROT = tft.Color565(255, 0, 0);
  tft.drawRect(0, 0, w, h, ROT);
  int br = 126;
  int ho = 126;
  int x0 = (w - br) / 2;
  int y0 = (h - ho) / 2;
  int x = 0;
  int y = ho-1;
  int i = 0;
  int s = sizeof rawData;
  while (i < s) {
    word c = pgm_read_byte(rawData + i++);
    byte r = c & B11100000;
    byte g = (c & B00011100) << 3;
    byte b = (c & B00000011) << 6;
    c = tft.Color565(r, g, b);
    tft.drawPixel(x0 + x, y0 + y, c);
    if (++x >= br) {
      y--;
      x = 0;
    }
  }
}

void loop() {}

В Arduino UNO он будет использовать 23 КБ FLASH и почти не будет использовать SRAM, так что у вас останется достаточно памяти для ваших основных алгоритмов. Чтобы продемонстрировать, чего вы можете ожидать, уменьшив разрешение, можно показать следующий пример.


Сжимаем RGB изображение, чтобы оно поместилось в Flash-память Arduino Uno

А теперь, что на самом деле может показать 1,8-дюймовый дисплей.


Сжимаем RGB изображение, чтобы оно поместилось в Flash-память Arduino Uno



© digitrode.ru


Теги: Arduino, память




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий