E-Paper Image Converter — Waveshare Byte Array

Convert any image into Waveshare e-paper byte buffers — including full 3-color black/white/red dual-buffer output. Pick your panel, generate, and paste straight into display.Display(). 100% in your browser.

1
Step 1

Upload Your Image

PNG · JPG · BMP · GIF
📷

Click or drag & drop to upload

For 3-color: keep reds pure & saturated

2
Step 2

Preview

🖼Upload an image to see the live preview
3
Step 3

Generate E-Paper Buffer

This e-paper image converter turns any image into the byte buffers a Waveshare or Good Display e-ink panel needs — including proper 3-color black/white/red output with a separate red layer. Drop in a PNG or JPG, pick your panel, and copy a const unsigned char buffer (or two, for tri-color) ready for display.Display(). Everything runs in your browser, so it works offline and never uploads your art. It is purpose-built for e-paper, unlike the OLED-focused image2cpp converter.

Why e-paper is different from OLED

E-paper (e-ink) displays are bistable: once an image is drawn, the panel holds it with zero power, which is why they are perfect for battery shelf labels, weather dashboards and name badges. But that physics changes how you feed them images. Refreshes are slow (seconds, not milliseconds), and many panels render more than two colors by stacking pigment layers. A three-color Waveshare panel can show black, white and red — but only by accepting two separate 1-bit buffers, one per non-white color.

How 3-color (black/white/red) buffers work

For a tri-color panel you send two bitmaps of identical dimensions:

A pixel that is black in neither buffer stays white (the panel's background). This converter analyses your source image: strongly red pixels are routed to the red layer, dark non-red pixels become black, and everything else is left white. That means you can design a poster in any image editor — red headline, black body text — and get both layers generated automatically. Most Waveshare panels treat a 0 bit as the colored pixel (black or red) and a 1 bit as white; this tool follows that convention. If your panel is reversed, toggle Invert.

Wiring a Waveshare e-paper module (SPI)

Waveshare e-paper HATs and bare panels talk SPI. A common ESP32 wiring:

Install the Waveshare e-Paper library (download it from Waveshare's GitHub for your exact model — the class name encodes the size and color, e.g. Epd in the epd2in9b folder for a 2.9" tri-color panel).

Full Arduino example — 3-color panel

Generate your buffers above (named poster here), then:

#include "epd2in9b_V3.h"   // 2.9" black/white/red

Epd epd;
// <-- paste poster_black[] and poster_red[] here -->

void setup() {
  if (epd.Init() != 0) return;
  epd.Display(poster_black, poster_red);
  epd.Sleep();   // ALWAYS sleep e-ink after a refresh
}

void loop() {}

For a plain black/white panel the call is simply epd.Display(poster); with the single buffer this tool generates in B/W mode. Calling Sleep() after every refresh is important — leaving an e-ink panel powered in its active state can damage it over time.

Getting a clean e-ink result

E-paper has no grayscale on a 2-color panel, so photos need dithering just like an OLED — Floyd-Steinberg and Atkinson both work well. For tri-color posters, keep your reds saturated and pure in the source image so the red-detection routing is unambiguous. Text and line art look sharpest with the Binary threshold mode and no dithering.

Power, refresh and longevity tips

Because e-ink holds its image without power, the ideal pattern is: wake the MCU, draw one frame, then deep-sleep both the panel and the microcontroller. Avoid full refreshes more often than the datasheet allows — rapid repeated refreshing causes ghosting and shortens panel life. Many modules support a faster partial refresh for small regions (a clock digit, a sensor value) while reserving the slow full-screen refresh for a periodic clean-up pass. The full-frame buffer this converter produces is exactly what you load before either kind of refresh, so it fits both workflows.

Need monochrome OLED output instead? Use the u8g2 converter or the classic image2cpp tool. Building a touchscreen GUI? See the LVGL converter.

Frequently Asked Questions

What is an e-paper image converter? +
An e-paper image converter turns an image into the byte array(s) a Waveshare or Good Display e-ink panel expects. Unlike OLEDs, e-paper is bistable (it holds an image with zero power) and many panels are multi-color — black/white, or black/white/red, or 7-color. This tool generates a black/white buffer plus, for 3-color panels, a separate red buffer, all in your browser.
How does 3-color (black/white/red) e-paper work? +
Three-color Waveshare panels need TWO bitmap buffers of the same size: one for the black layer and one for the red (or yellow) layer. A bit set in the black buffer turns that pixel black; a bit set in the red buffer turns it red. This converter detects strongly red pixels in your image, routes them to the red buffer, and sends everything else to the black/white buffer.
How do I display the buffers on a Waveshare panel? +
With the Waveshare Arduino library: call display.Init(), then for a 3-color panel display.Display(blackBuffer, redBuffer); or for a black/white panel display.Display(blackBuffer);. The buffer variable names are printed in the generated code. Always call the panel sleep function afterwards to protect the e-ink.
Why is e-paper byte order different from OLED? +
Most Waveshare panels store pixels horizontally, MSB-first, one bit per pixel, with rows padded to a byte — similar to Adafruit GFX. But the polarity is often inverted: on many e-paper panels a 0 bit means black and a 1 bit means white. This tool follows the common Waveshare convention; if your image is inverted, toggle the Invert option.
Is the e-paper converter free and private? +
Yes. It runs entirely client-side using the Canvas API — your image is never uploaded. No signup, no watermark, no conversion limit.
Which Waveshare e-paper sizes are supported? +
Any size — set the canvas width and height to match your panel. Presets are included for popular modules like the 2.9" (296x128), 2.13" (250x122), 1.54" (200x200) and 4.2" (400x300). For partial-refresh panels, the full-frame buffer this tool generates is still what you load before a refresh.

More embedded converters

Image to C++ Converter
The classic image2cpp — SSD1306, ST7735, Adafruit GFX & u8g2 byte arrays.
u8g2 Bitmap Converter
Image to u8g2 XBM / drawXBMP byte array for monochrome OLEDs.
LVGL Image Converter
Image to LVGL lv_img_dsc_t C array for ESP32 GUIs.
Adafruit GFX Font Converter
Convert a font to an Adafruit GFX font header (.h) in your browser.
Developer Calculators ↗
Bit/byte, hex, base, color & sizing calculators for embedded work.
JSON & Dev Tools ↗
Format, validate & convert JSON, CSV, base64 and more — 15 tools.