arduino/libraries/LovyanGFX/examples/Standard/SavePNG/SavePNG.ino
2026-09-27 17:21:39 +02:00

94 lines
1.8 KiB
C++

#if defined (ARDUINO_WIO_TERMINAL)
#include <Seeed_FS.h>
#include <SD/Seeed_SD.h>
#else
#include <SD.h>
#include <SPIFFS.h>
#endif
#include <LovyanGFX.hpp>
static LGFX lcd;
static constexpr char filename[] = "/lovyangfx_test.png";
#ifndef SDCARD_SS_PIN
#define SDCARD_SS_PIN 4
#endif
#ifndef SDCARD_SPI
#define SDCARD_SPI SPI
#endif
bool saveToSD(void)
{
// createPng関数で指定範囲の画像からPNG形式のデータを生成します。
// SAMD51の場合 172x172程度が上限です。
// ESP32の場合 192x192程度が上限です。
// メモリ使用状況によってさらに縮みます。
// ESP32でPSRAMが有効な場合は大きなサイズでも保存できる可能性があります。
std::size_t dlen;
std::uint8_t* png = (std::uint8_t*)lcd.createPng(&dlen, 0, 0, 128, 128);
if (!png)
{
Serial.print("error:createPng\n");
return false;
}
Serial.print("success:createPng\n");
bool result = false;
File file = SD.open(filename, "w");
if (file)
{
file.write((std::uint8_t*)png, dlen);
file.close();
result = true;
}
else
{
Serial.print("error:file open failure\n");
}
free(png);
return result;
}
void setup(void)
{
lcd.init();
Serial.begin(115200);
lcd.setColorDepth(24);
lcd.setColor(TFT_WHITE);
lcd.startWrite();
lcd.setAddrWindow(0, 0, lcd.width(), lcd.height());
for (int y = 0; y < lcd.height(); ++y)
{
for (int x = 0; x < lcd.width(); ++x)
{
lcd.writeColor( lcd.color888(x << 1, x + y, y << 1), 1);
}
}
lcd.print("PNG save test\n");
lcd.endWrite();
do {
SD.end();
delay(1000);
SD.begin(SDCARD_SS_PIN, SDCARD_SPI, 25000000);
} while (!saveToSD());
lcd.print("PNG save success.");
}
void loop(void)
{
lcd.drawPngFile(SD, filename, random(-20,20), random(-20, 20));
}