mirror of https://github.com/arendst/Tasmota.git
Merge pull request #13912 from s-hadinger/lvgl_screenshot_bmp
LVGL screenshot in BMP format
This commit is contained in:
commit
86e84d167b
|
@ -915,11 +915,53 @@ extern "C" {
|
||||||
if (!glue) { be_return_nil(vm); }
|
if (!glue) { be_return_nil(vm); }
|
||||||
|
|
||||||
char fname[32];
|
char fname[32];
|
||||||
snprintf(fname, sizeof(fname), "/screenshot-%d.raw", Rtc.utc_time);
|
snprintf(fname, sizeof(fname), "/screenshot-%d.bmp", Rtc.utc_time);
|
||||||
File f = dfsp->open(fname, "w");
|
File f = dfsp->open(fname, "w");
|
||||||
if (f) {
|
if (f) {
|
||||||
glue->setScreenshotFile(&f);
|
glue->setScreenshotFile(&f);
|
||||||
|
|
||||||
|
uint32_t bmp_width = lv_disp_get_hor_res(nullptr);
|
||||||
|
uint32_t bmp_height = lv_disp_get_ver_res(nullptr);
|
||||||
|
|
||||||
|
// write BMP header
|
||||||
|
static const uint8_t bmp_sign[] = { 0x42, 0x4d }; // BM = Windows
|
||||||
|
f.write(bmp_sign, sizeof(bmp_sign));
|
||||||
|
size_t bmp_size = bmp_width * bmp_height * LV_COLOR_DEPTH / 8 + 0x44;
|
||||||
|
f.write((uint8_t*)&bmp_size, sizeof(bmp_size));
|
||||||
|
uint32_t zero = 0;
|
||||||
|
f.write((uint8_t*) &zero, sizeof(zero)); // reserved 4-bytes
|
||||||
|
uint32_t bmp_offset_to_pixels = 0x44; // TODO
|
||||||
|
f.write((uint8_t*) &bmp_offset_to_pixels, sizeof(bmp_offset_to_pixels));
|
||||||
|
|
||||||
|
// DIB Header BITMAPINFOHEADER
|
||||||
|
size_t bmp_dib_header_size = 52; // BITMAPV2INFOHEADER
|
||||||
|
f.write((uint8_t*) &bmp_dib_header_size, sizeof(bmp_dib_header_size));
|
||||||
|
|
||||||
|
f.write((uint8_t*) &bmp_width, sizeof(bmp_width));
|
||||||
|
f.write((uint8_t*) &bmp_height, sizeof(bmp_height));
|
||||||
|
|
||||||
|
// rest of header
|
||||||
|
// BITMAPV2INFOHEADER = 52 bytes header, 40 bytes sub-header
|
||||||
|
static const uint8_t bmp_dib_header[] = {
|
||||||
|
0x01, 0x00, // planes
|
||||||
|
16, 0x00, // bits per pixel = 16
|
||||||
|
0x03, 0x00, 0x00, 0x00, // compression = BI_BITFIELDS uncrompressed
|
||||||
|
0x00, 0x00, 0x00, 0x00, // Image size, 0 is valid for BI_RGB (uncompressed) TODO
|
||||||
|
0x00, 0x00, 0x00, 0x00, // X pixels per meter
|
||||||
|
0x00, 0x00, 0x00, 0x00, // Y pixels per meter
|
||||||
|
0x00, 0x00, 0x00, 0x00, // Colors in table
|
||||||
|
0x00, 0x00, 0x00, 0x00, // Important color count
|
||||||
|
|
||||||
|
// RGB masks
|
||||||
|
0x00, 0xF8, 0x00, 0x00, // Red channel mask
|
||||||
|
0xE0, 0x07, 0x00, 0x00, // Green channel mask
|
||||||
|
0x1F, 0x00, 0x00, 0x00, // Blue channel mask
|
||||||
|
|
||||||
|
0x00, 0x00, // Padding to align on 4 bytes boundary
|
||||||
|
};
|
||||||
|
f.write(bmp_dib_header, sizeof(bmp_dib_header));
|
||||||
|
// now we can write the pixels array
|
||||||
|
|
||||||
// redraw screen
|
// redraw screen
|
||||||
lv_obj_invalidate(lv_scr_act());
|
lv_obj_invalidate(lv_scr_act());
|
||||||
lv_refr_now(lv_disp_get_default());
|
lv_refr_now(lv_disp_get_default());
|
||||||
|
|
Loading…
Reference in New Issue