The Pictures Stored in one Big const byte array, 3Byte/Pixel ordered by ascii Code.

In this Case the Picture data fired directly to SPI, we need only calculate the Array Startpoint for Every Char. The Transparency Function is very simple and fast.

For best Practice i coded a little Java Tool that converts and sort all BMPs in one folder to Bin File and generate hex Array as array.h to include it in sketch..

uint32_t startbyte=Asciicode*width*height*3

String lasttext = "";
void DrawString( const uint8_t* check, int x, int y, int width, int height, String text, bool compare, bool transp) {
 
  int lengthl = text.length();
  for (int l = 0; l < lengthl; l++)
  { uint32_t charpos = ((uint32_t)((uint32_t)text.charAt(l) - (uint32_t)48) * (uint32_t)width * height * 3);
 
    if (text.charAt(l) == '.')
      charpos = ((uint32_t)((uint32_t)11) * (uint32_t)width * height * 3);
    if (compare) {
      if (lasttext.charAt(l) != text.charAt(l))
        if (transp)
          prepareImage2fromram(check + charpos, x + l * width, y, width, height, 0);
        else  prepareImagefromram(check + charpos, x + l * width, y, width, height, 0);
    }
    else if (transp) prepareImage2fromram(check + charpos, x + l * width, y, width, height, 0);
    else  prepareImagefromram(check + charpos, x + l * width, y, width, height, 0);
    lasttext = text;
  }
}
 
 
 
void prepareImagefromram(const uint8_t* check, int x, int y, int width, int height, uint32_t tcolor) {
  tft.setWindow(x, y, x + width - 1, y + height - 1);
  vspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0));
  digitalWrite(5, LOW); //pull SS slow to prep other end for transfer
  vspi->writeBytes((uint8_t*)check, width * height * 3);
  digitalWrite(5, HIGH); //pull ss high to signify end of data transfer
  vspi->endTransaction();
}

void prepareImage2fromram( const uint8_t* check, int x, int y, int width, int height, uint32_t tcolor) {

  tft.setWindow(x, y, x + width - 1, y + height - 1);
  byte *temp = (byte*)malloc(width * height * 3);

  memcpy(temp, check, width * height * 3);
  for (int i = 0; i < height ; i = i + 1) {
    for (int c = 0; c < width * 3 ; c = c + 3) {
      unsigned long offsetbg = ((y + i) * 480 * 3 ) + (x * 3) + c;
      if (temp[(i * width * 3 + c)] == 0 && temp[(i * width * 3 + c) + 1] == 0 && temp[(i * width * 3 + c) + 2] == 0)
      {
        uint32_t offsetc = i * width * 3 + c;
        temp[offsetc ]     = (uint8_t)_actest[bgstart + offsetbg];
        temp[offsetc + 1]  = (uint8_t)_actest[bgstart + offsetbg + 1];
        temp[offsetc + 2]  = (uint8_t)_actest[bgstart + offsetbg + 2];
      }
    }
  }

  vspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0));
  digitalWrite(5, LOW); //pull SS slow to prep other end for transfer
  vspi->writeBytes((uint8_t*)temp, width * height * 3);
  digitalWrite(5, HIGH); //pull ss high to signify end of data transfer
  free(temp);
}