Last active
November 23, 2020 06:16
-
-
Save tanakamasayuki/19aab242d4c24e692fef0ffc8968b6f2 to your computer and use it in GitHub Desktop.
LovyanGFX ScreenShot ESP32 Sample
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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