image2cpp - Resimden C Dizisi Oluşturucu (Mono ve Renkli)
image2cpp (LCD Assistant), bir resmi C dizisine veya bayt dizisine çeviren, elinizdeki diziyi de tekrar resme döndüren ücretsiz bir araçtır. Arduino, ESP32 ve Raspberry Pi projelerinde kullanılan iki ekran tipini de kapsar: 1 bit tek renkli (SSD1306 / SH1106 OLED ve Nokia 5110) ve RGB565 veya RGB888 renkli (ST7735, ST7789, ILI9341, ILI9488 TFT paneller). Çıktı olarak Adafruit GFX, U8g2, düz bayt veya MicroPython / CircuitPython seçebilirsiniz.
1. Fotoğraf seç
veya
1. Düz Bayt dizisi yapıştır
2. Fotoğraf Ayarları
3. Ön izleme
4. Çıktı
bytearray formatında çıktı oluşturur.GFXbitmapFont formatında bir çıktı oluşturur. Değiştirilmiş bir versiyonuyla kullanılan Adafruit GFX kütüphanesine aittir. GitHub projesi ve örnek kod bitmap-fontHer fotoğraf için 1 karakter uzunluğunda bir glif tanımlayıcısı sağlanmazsa, ilk ASCII karakter değeri kullanılır. Değer, her glif için 1 artırılır.
Aşağıdaki fotoğraf gibi fotoğrafınız ekranınızda bozuk görünüyorsa, farklı bir mod kullanın.
Hangi çıktı biçimini seçmeliyim?
Çizim modu, piksellerin baytlara nasıl paketleneceğini belirler. Zevke göre değil, ekran sürücüsüne göre seçin; yoksa resim dilimlenmiş veya aynalanmış çıkar.
| Çizim modu | Bayt / piksel | Tipik ekranlar | Çizim çağrısı |
|---|---|---|---|
| Mono, yatay | 1 bit | SSD1306, SH1106, SSD1309 OLED | drawBitmap() / drawXBM() |
| Mono, dikey | 1 bit | Nokia 5110 (PCD8544), SSD1306 sayfa modu | ham tampon yazma |
| Renkli RGB565 | 2 bayt | ST7735, ST7789, ILI9341, ILI9488, GC9A01 | drawRGBBitmap() / pushImage() |
| Alfa maskesi | 1 bit | renkli bitmap yanında saydamlık maskesi olarak | maskeli blit |
| Renkli RGB888 | 3 bayt | 24 bit çerçeve tamponları, ESP32 RGB LCD panelleri | panel sürücüsü |
| Renkli HSV | 3 bayt | LED matrisler, çalışma anında ton kaydıran efektler | özel |
Diziyi kodunuzda kullanmak
Tek renkli OLED, Adafruit SSD1306:
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 64, &Wire, -1);
// yukarıdaki Çıktı kutusundaki diziyi yapıştırın
const unsigned char myBitmap [] PROGMEM = { /* ... */ };
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.drawBitmap(0, 0, myBitmap, 128, 64, SSD1306_WHITE);
display.display();
}U8g2 ile tek renkli (XBM bayt sırası):
u8g2.firstPage();
do {
u8g2.drawXBMP(0, 0, 128, 64, myBitmap);
} while (u8g2.nextPage());ST7735 / ILI9341 üzerinde renkli RGB565, Adafruit GFX:
#include <Adafruit_ILI9341.h>
// RGB565 çıktısı piksel başına 2 bayt, bu yüzden unsigned char değil uint16_t
const uint16_t myImage [] PROGMEM = { /* ... */ };
tft.drawRGBBitmap(0, 0, myImage, 160, 128);TFT_eSPI ile renkli RGB565 (daha hızlı, ESP32 için ideal):
#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI();
tft.setSwapBytes(true); // renkler ters görünüyorsa bu satırı kaldırın
tft.pushImage(0, 0, 160, 128, myImage);Ne kadar bellek tutar?
1 bit bitmap genişlik / 8 * yükseklik bayt tutar. RGB565 bitmap ise genişlik * yükseklik * 2. Aradaki fark hangi kartı kullanabileceğinizi belirler:
- 128x64 tek renkli OLED: 1.024 bayt. Arduino Uno flash'ına düşünmeden sığar.
- 160x128 RGB565 (ST7735): 40.960 bayt. Uno'nun 32 KB'lık tüm flash'ından zaten büyük. ESP32, RP2040 kullanın veya SD karttan akıtın.
- 320x240 RGB565 (ILI9341): 153.600 bayt. Sadece ESP32 veya SD kart.
Renkli resim sığmıyorsa Floyd-Steinberg dithering ile 1 bite çevirin. Küçük panelde dithering'li hâli, aşırı küçültülmüş renkli hâlinden genelde daha okunaklı görünür.
Sık sorulan sorular
image2cpp renkli resim destekliyor mu?
Evet. Klasik 1 bit tek renkli modun yanında RGB565 (2 bayt/piksel), RGB888 (3 bayt/piksel) ve HSV dizi çıktısı verir. Renkli RGB565 - 2 bayt/piksel çizim modunu seçerseniz ST7735, ST7789, ILI9341 veya ILI9488 TFT ekrana doğrudan gönderebileceğiniz bir dizi elde edersiniz.
RGB565 nedir, neden piksel başına 2 bayt?
RGB565 bir rengi 16 bite sıkıştırır: 5 bit kırmızı, 6 bit yeşil, 5 bit mavi. Fazladan bit yeşile gider çünkü göz en çok yeşile duyarlıdır. Sonuç, 24 bit RGB888'in yarısı bellekte 65.536 renk. Arduino ve ESP32 üzerindeki neredeyse her küçük TFT sürücüsü bu yüzden RGB565 kullanır.
Diziyi SSD1306 128x64 OLED'de nasıl gösteririm?
Tuvali 128x64 yapın, yatay tek renkli çizim modunu ve Adafruit GFX çıktı biçimini seçin, sonra display.drawBitmap(0, 0, myBitmap, 128, 64, SSD1306_WHITE) ve ardından display.display() çağırın.
Yatay mı, dikey mi?
Adafruit GFX drawBitmap ve U8g2 drawXBM için yatay; bu çoğu SSD1306 ve SH1106 kodunu kapsar. Nokia 5110 (PCD8544) gibi sayfa adresli sürücüler ve ham SSD1306 sayfa tamponları için dikey. Resim yatay şeritlere bölünüyorsa yanlış olanı seçmişsinizdir.
Bitmap neden bozuk veya kaymış görünüyor?
Neredeyse her zaman genişlik uyuşmazlığı. Dizinin genişliği drawBitmap'e verdiğiniz genişlikle aynı olmalı ve 1 bit modlarda 8'in katı olmalı; aksi halde her satır doldurulur ve resim çapraz kayar. İkinci olarak bayt sırasını, RGB565'teyseniz ve şekil değil renkler ters görünüyorsa üçüncü olarak setSwapBytes() ayarını kontrol edin.
Adafruit GFX mi U8g2 mi, fark ne?
Adafruit GFX, drawBitmap ile çizilen bir PROGMEM bayt dizisi bekler ve 1 bitini açık piksel sayar. U8g2 ise drawXBM ile XBM sıralaması kullanır; orada her baytın içindeki bitler ters çevrilidir. Yanlışını seçmek her 8 pikseli aynalar.
C dizisini tekrar resme çevirebilir miyim?
Evet. Mevcut bir bayt dizisini Düz Bayt dizisi yapıştır kutusuna yapıştırın, doğru genişlik, yükseklik ve çizim modunu seçin; önizleme diziyi resme geri çevirir. Başkasının kodundan gelen bir bitmap'i kontrol etmek için kullanışlı.
Hareketli GIF çevirebilir miyim?
Burada hayır. Bu dönüştürücü tek bir durağan kare okur, çünkü dosyayı bir HTML canvas'a çiziyor ve canvas aynı anda tek kare tutuyor. Hareketli GIF verdiğinizde yalnızca birinci kareyi alırsınız. Animasyonlar için GIF'ten OLED animasyon dönüştürücüyü kullanın; o araç GIF formatını doğrudan ayrıştırıp her kareyi ayrı bir dizi olarak verir, üstüne kareler arasında dolaşan hazır kodu da üretir.
Hangi resim boyutunu kullanmalıyım?
Ekranınıza göre: yaygın SSD1306 OLED'ler için 128x64 veya 128x32, Nokia 5110 için 84x48, ST7735 için 160x128, yuvarlak GC9A01 için 240x240, ILI9341 için 320x240.