2.13" e-paper image converter
2.13-inch e-paper panels have a resolution of 250×122 pixels. They are available as black & white, 3-color (black/white/red), 3-color (black/white/yellow), 4-color (black/white/yellow/red). Pick the resolution and colors that match your panel, upload a photo and DitherInk will crop it, dither it with its tuned Atkinson algorithm and give you a file your firmware can use directly.
2.13" 250×122
| Native resolution | 250 × 122 (30,500 pixels, 125:61) |
|---|---|
| Portrait image size | 122 × 250 |
| Landscape image size | 250 × 122 |
| Colors | Buffer format | .bin size |
|---|---|---|
| Black & White | mono_1bpp | 3,904 bytes (3.8 KB) |
| 3-color (Black/White/Red) | tri_2plane | 7,808 bytes (7.6 KB) |
| 3-color (Black/White/Yellow) | tri_2plane | 7,808 bytes (7.6 KB) |
| 4-color (Black/White/Yellow/Red) | color_2bpp | 7,686 bytes (7.5 KB) |
Portrait or landscape?
The panel always receives its buffer in its native 250×122 layout. If your frame stands upright, choose Portrait: you crop a 122×250 image and DitherInk rotates the buffer 90° counterclockwise before writing the file. If your driver expects a different rotation, change it under Advanced output options.
Which file should I download?
- .h: a C array you can
#includein an Arduino or ESP-IDF project. Easiest for a single fixed image. - .bin: the raw frame buffer. Store it on an SD card or in flash and stream it to the panel. Best when images change.
- .png: an indexed PNG whose pixel values are the color codes. Handy for Python on a Raspberry Pi.
- .bmp: an indexed bitmap for photo frames and tools that read BMP files.
Tips for black & white
High-contrast images, line art and text work best. For photos, Auto mode lifts the shadows a little so dark areas do not collapse into solid black.
Example code (250×122, Black & White)
Arduino / ESP-IDF with the .h file
#include "my_image.h" // downloaded from DitherInk
// MY_IMAGE_WIDTH x MY_IMAGE_HEIGHT = 250 x 122, mono_1bpp
// Color codes: black=0, white=1
// The buffer is already in the panel's native orientation.
void showImage() {
epd_write_frame(my_image, MY_IMAGE_SIZE); // your driver's full-frame write
epd_refresh();
}Replace epd_write_frame and epd_refresh with the functions your display driver provides. Most drivers have a function that takes a full frame buffer.
ESP32 loading the .bin file from flash
#include <LittleFS.h>
constexpr size_t FRAME_BYTES = 3904;
static uint8_t frame[FRAME_BYTES];
bool loadFrame(const char* path) {
File f = LittleFS.open(path, "r");
if (!f || f.size() != FRAME_BYTES) return false; // wrong size = wrong panel settings
f.read(frame, FRAME_BYTES);
f.close();
return true;
}Python (Raspberry Pi) reading the .bin file
import numpy as np
data = np.fromfile("my_image.bin", dtype=np.uint8)
assert data.size == 3904
bits = np.unpackbits(data).reshape(122, -1)[:, :250] # 1 = white, 0 = blackNot sure about your panel's details? See how e-paper frame buffers are laid out.