Skip to content

Instantly share code, notes, and snippets.

@tanakamasayuki
Last active November 23, 2020 06:16
Show Gist options
  • Save tanakamasayuki/19aab242d4c24e692fef0ffc8968b6f2 to your computer and use it in GitHub Desktop.
Save tanakamasayuki/19aab242d4c24e692fef0ffc8968b6f2 to your computer and use it in GitHub Desktop.
LovyanGFX ScreenShot ESP32 Sample
#define LGFX_AUTODETECT
#include <LovyanGFX.hpp>
#include "SD.h"
static LGFX lcd;
#define TFCARD_CS_PIN 4 // M5Stack(BASIC, GRAY, FIRE, GO, Core2)
void setup() {
lcd.init();
lcd.clear(TFT_BLACK);
SD.begin(TFCARD_CS_PIN, SPI, 20000000);
lcd.clear(TFT_RED);
lcd.println("SCREEN SHOT TEST");
screenshot(&lcd, SD, "/test.bmp");
}
void loop() {
}
void screenshot(LovyanGFX* _lcd, fs::FS &fs, String filename) {
File file = fs.open(filename, FILE_WRITE);
if (!file) {
ESP_LOGW("file not open(%s)\n", filename);
}
uint8_t headSize = 66;
uint16_t width = _lcd->width();
uint16_t height = _lcd->height();
uint16_t dataSize = width * height * 2;
uint16_t fileSize = headSize + dataSize;
uint16_t rMask = 0b1111100000000000;
uint16_t gMask = 0b0000011111100000;
uint16_t bMask = 0b0000000000011111;
// BMP Header
file.write('B');
file.write('M');
// fileSize
file.write((uint8_t)(fileSize & 0xff));
file.write((uint8_t)(fileSize >> 8));
file.write(0x00);
file.write(0x00);
// Reserve
file.write(0x00);
file.write(0x00);
file.write(0x00);
file.write(0x00);
// headSize
file.write(headSize);
file.write(0x00);
file.write(0x00);
file.write(0x00);
// infoSize
file.write(0x28);
file.write(0x00);
file.write(0x00);
file.write(0x00);
// width
file.write((uint8_t)(width & 0xff));
file.write((uint8_t)(width >> 8));
file.write(0x00);
file.write(0x00);
// height
file.write((uint8_t)(height & 0xff));
file.write((uint8_t)(height >> 8));
file.write(0x00);
file.write(0x00);
// plane
file.write(0x01);
file.write(0x00);
// bit/pixel
file.write(16);
file.write(0x00);
// compression
file.write(0x03);
file.write(0x00);
file.write(0x00);
file.write(0x00);
// dataSize
file.write((uint8_t)(dataSize & 0xff));
file.write((uint8_t)(dataSize >> 8));
file.write(0x00);
file.write(0x00);
// Horizontal resolution
file.write(0x00);
file.write(0x00);
file.write(0x00);
file.write(0x00);
// Vertical resolution
file.write(0x00);
file.write(0x00);
file.write(0x00);
file.write(0x00);
// Color Size
file.write(0x00);
file.write(0x00);
file.write(0x00);
file.write(0x00);
// Number of important colors
file.write(0x00);
file.write(0x00);
file.write(0x00);
file.write(0x00);
// R MASK
file.write((uint8_t)(rMask & 0xff));
file.write((uint8_t)(rMask >> 8));
file.write(0x00);
file.write(0x00);
// G MASK
file.write((uint8_t)(gMask & 0xff));
file.write((uint8_t)(gMask >> 8));
file.write(0x00);
file.write(0x00);
// B MASK
file.write((uint8_t)(bMask & 0xff));
file.write((uint8_t)(bMask >> 8));
file.write(0x00);
file.write(0x00);
// DATA
bool swap = _lcd->getSwapBytes();
_lcd->setSwapBytes(true);
for (int y = 0; y < height; y++) {
uint16_t pl[width];
_lcd->readRect(0, height - y - 1, width, 1, pl);
file.write((uint8_t *)pl, width * 2);
}
_lcd->setSwapBytes(swap);
file.close();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment