github aitjcize/esp32-photoframe v2.17.0

5 hours ago

What's New

  • Large images now process on the device. The image pipeline was rewritten to stream row by row instead of holding full-resolution buffers in RAM. Photos that previously failed with out-of-memory errors — especially on high-resolution panels like the 1872×1404 reTerminal E1003 — now processand display directly on the frame. Large PNGs decode as a stream, never
    holding a full copy in memory.
  • Grayscale (GC16) panels convert correctly on-device. Dedicated 16-level grayscale decode and dithering (linear-light error diffusion against your panel's calibrated ramp) replaces the 6-color path that produced wrong tones. Black & white and grayscale sources render properly.
  • New Scale Mode setting: Cover or Fit. Choose whether photos crop to fill the panel (Cover) or letterbox with a clean white or black background (Fit). Applies to on-device processing and syncs with the server, the mobile app, and Home Assistant (companion releases: server v1.15.0, HA integration v2.10.0, app v1.4.0).

Improvements

  • On-device processing now matches epaper-image-convert exactly: gamma-space resampling, calibrated gray ramps, and per-channel dynamic-range compression — pure white backgrounds render clean, with no red speckle.
  • Rotation follows your configured display orientation instead of guessing from each image's aspect ratio.
  • /api/current_image reliably reflects what's on the panel across every display flow, serving the original image or its thumbnail; direct uploads stream straight to the panel with no file round-trip.
  • Settings edited on the device or via Home Assistant now advance the config revision, so a server-side sync can no longer revert them.
  • New host-based test suite covering the image pipeline, the current-image/thumbnail lifecycle, and orientation handling.

Installation

Web Flasher (Easiest)

Flash directly from your browser (Chrome/Edge/Opera required):
https://aitjcize.github.io/esp32-photoframe/#flash

Manually

Choose the appropriate merged binary for your board:

  • photoframe-firmware-waveshare_photopainter_73-merged.bin: For Waveshare 7.3" 7-color e-paper
  • photoframe-firmware-seeedstudio_xiao_ee02-merged.bin: For Seeed XIAO EE02
  • photoframe-firmware-seeedstudio_reterminal_e1002-merged.bin: For Seeed reTerminal E1002
  • photoframe-firmware-seeedstudio_xiao_ee04-merged.bin: For Seeed XIAO EE04
  • photoframe-firmware-seeedstudio_reterminal_e1004-merged.bin: For Seeed reTerminal E1004
  • photoframe-firmware-seeedstudio_reterminal_e1003-merged.bin: For Seeed reTerminal E1003 (10.3" grayscale)
  • photoframe-firmware-seeedstudio_xiao_ee03-merged.bin: For Seeed XIAO EE03 (10.3" grayscale)
esptool.py --chip esp32s3 --port /dev/ttyUSB0 --baud 921600 write_flash 0x0 photoframe-firmware-[board]-merged.bin

Don't miss a new esp32-photoframe release

NewReleases is sending notifications on new releases.