87 lines
2.9 KiB
C++
87 lines
2.9 KiB
C++
|
|
// This example renders a png file that is stored in a FLASH array
|
|
// using the PNGdec library (available via library manager).
|
|
|
|
// The example png is encoded as ARGB 8 bits per pixel with indexed colour
|
|
// It was created using GIMP and has a transparent background area.
|
|
|
|
// Image files can be converted to arrays using the tool here:
|
|
// https://notisrac.github.io/FileToCArray/
|
|
// To use this tool:
|
|
// 1. Drag and drop PNG image file on "Browse..." button
|
|
// 2. Tick box "Treat as binary"
|
|
// 3. Click "Convert"
|
|
// 4. Click "Save as file" and move the header file to sketch folder
|
|
// (alternatively use the "Copy to clipboard" and paste into a new tab)
|
|
// 5. Open the sketch in IDE
|
|
// 6. Include the header file containing the array (SpongeBob.h in this example)
|
|
|
|
// Include the PNG decoder library, available via the IDE library manager
|
|
#include <PNGdec.h>
|
|
|
|
// Include image array
|
|
#include "SpongeBob.h"
|
|
|
|
PNG png; // PNG decoder instance
|
|
|
|
#define MAX_IMAGE_WDITH 240 // Sets rendering line buffer lengths, adjust for your images
|
|
|
|
// Include the TFT library - see https://github.com/Bodmer/TFT_eSPI for library information
|
|
#include "SPI.h"
|
|
#include <TFT_eSPI.h> // Hardware-specific library
|
|
TFT_eSPI tft = TFT_eSPI(); // Invoke custom library
|
|
|
|
// Position variables must be global (PNGdec does not handle position coordinates)
|
|
int16_t xpos = 0;
|
|
int16_t ypos = 0;
|
|
|
|
//====================================================================================
|
|
// Setup
|
|
//====================================================================================
|
|
void setup()
|
|
{
|
|
Serial.begin(115200);
|
|
Serial.println("\n\n Using the PNGdec library");
|
|
|
|
// Initialise the TFT
|
|
tft.begin();
|
|
tft.fillScreen(TFT_BLACK);
|
|
|
|
Serial.println("\r\nInitialisation done.");
|
|
}
|
|
|
|
//====================================================================================
|
|
// Loop
|
|
//====================================================================================
|
|
void loop()
|
|
{
|
|
uint16_t pngw = 0, pngh = 0; // To store width and height of image
|
|
|
|
int16_t rc = png.openFLASH((uint8_t *)bob, sizeof(bob), pngDraw);
|
|
|
|
if (rc == PNG_SUCCESS) {
|
|
Serial.println("Successfully png file");
|
|
pngw = png.getWidth();
|
|
pngh = png.getHeight();
|
|
Serial.printf("Image metrics: (%d x %d), %d bpp, pixel type: %d\n", pngw, pngh, png.getBpp(), png.getPixelType());
|
|
|
|
tft.startWrite();
|
|
uint32_t dt = millis();
|
|
rc = png.decode(NULL, 0);
|
|
tft.endWrite();
|
|
Serial.print(millis() - dt); Serial.println("ms");
|
|
tft.endWrite();
|
|
|
|
// png.close(); // Required for files, not needed for FLASH arrays
|
|
}
|
|
|
|
delay(250);
|
|
|
|
// Randomly change position
|
|
xpos = random(tft.width() - pngw);
|
|
ypos = random(tft.height() - pngh);
|
|
|
|
// Fill screen with a random colour at random intervals
|
|
if (random(100) < 20) tft.fillScreen(random(0x10000));
|
|
}
|