std.image — Bildverarbeitung
Das std.image-Paket stellt eine einheitliche API zum Laden und Verarbeiten von Rasterbildern bereit. Alle Formate werden auf ein gemeinsames internes Format normalisiert: RGBA, 4 Kanäle, 8 Bit pro Kanal, zeilenweise top-down.
→ Units-Übersicht · Lyx-Sprache
Units
| Unit | Code | Beschreibung |
|---|---|---|
| std.image.core | GRF-00 | GrfImage-Struct, Pixel-Operationen, Format-Erkennung, Datei-I/O-Helper |
| std.image.image | GRF-08 | Unified Facade: Auto-Detect + Dispatch auf alle Format-Decoder |
std.image.bmp | GRF-01 | BMP-Decoder |
std.image.png | GRF-02 | PNG-Decoder |
std.image.jpeg | GRF-03 | JPEG-Decoder |
std.image.gif | GRF-04 | GIF-Decoder |
std.image.tiff | GRF-05 | TIFF-Decoder (Little-Endian und Big-Endian) |
std.image.webp | GRF-06 | WebP-Decoder |
std.image.avif | GRF-07 | AVIF-Decoder |
Für die meisten Anwendungsfälle genügt der Import von std.image.image:
import std.image.image;
import std.alloc;
import std.io;
fn main(): int64 {
var img: int64 := GrfImageAlloc(0, 0); // nur Struct, noch keine Pixel
var ok: int64 := ImageDecode("foto.jpg"c as int64, 0, img);
if (ok == 0) { PrintLn("Fehler beim Laden"); return 1; }
var w: int64 := ImageGetWidth(img);
var h: int64 := ImageGetHeight(img);
PrintLn("Breite: " + IntToStr(w) + " Höhe: " + IntToStr(h));
// Pixel an (100, 50) lesen — Format: 0xRRGGBBAA
var px: int64 := ImagePixelAt(img, 100, 50);
PrintLn("Rot: " + IntToStr((px >> 24) & 255));
ImageFree(img);
return 0;
}
GrfImage-Struct
GrfImage ist ein 56-Byte-Kontroll-Struct im Heap. Alle Felder sind int64 (8 Bytes):
| Konstante | Offset | Inhalt |
|---|---|---|
GRF_OFF_WIDTH | 0 | Breite in Pixeln |
GRF_OFF_HEIGHT | 8 | Höhe in Pixeln |
GRF_OFF_CHANNELS | 16 | Kanalanzahl (immer 4 = RGBA) |
GRF_OFF_DEPTH | 24 | Bits pro Kanal (immer 8) |
GRF_OFF_FORMAT | 32 | Quellformat (GRF_FMT_*) |
GRF_OFF_PIXELS | 40 | Zeiger auf Pixel-Buffer |
GRF_OFF_PIXLEN | 48 | Größe des Pixel-Buffers (= w×h×4 Bytes) |
GRF_SIZE | 56 | Gesamtgröße des Structs |
Das Pixel-Format ist RGBA row-major top-down: Byte 0 = R, Byte 1 = G, Byte 2 = B, Byte 3 = A.
Als gepackter int64: 0xRRGGBBAA.
Format-Konstanten
GrfDetectFormat() erkennt das Format anhand der Magic-Bytes am Anfang des Puffers:
| Konstante | Wert | Format | Magic |
|---|---|---|---|
GRF_FMT_UNKNOWN | 0 | Unbekannt | — |
GRF_FMT_BMP | 1 | BMP | BM (0x42 0x4D) |
GRF_FMT_PNG | 2 | PNG | 89 50 4E 47 |
GRF_FMT_JPEG | 3 | JPEG | FF D8 FF |
GRF_FMT_GIF | 4 | GIF | GIF8 |
GRF_FMT_TIFF | 5 | TIFF | II 2A 00 oder MM 00 2A |
GRF_FMT_WEBP | 6 | WebP | RIFF….WEBP (ab Offset 8) |
GRF_FMT_AVIF | 7 | AVIF | ftyp avif/avis (Offset 4/8) |
Öffentliche API (std.image.image)
Laden
// Aus Speicher-Puffer laden (Format wird automatisch erkannt)
// img muss vorher mit GrfImageAlloc alloziert werden.
// Gibt 1 bei Erfolg zurück, 0 bei Fehler.
var ok: int64 := ImageDecodeFromMem(buf, len, img);
// Aus Datei laden (liest Datei intern, ruft ImageDecodeFromMem auf)
// plen: Zeiger auf int64, erhält Dateigröße; oder 0 wenn nicht benötigt.
var ok: int64 := ImageDecode(path, plen, img);
Freigeben
ImageFree(img); // gibt Pixel-Buffer + Struct frei
Accessor-Funktionen
var w: int64 := ImageGetWidth(img); // Breite in Pixeln
var h: int64 := ImageGetHeight(img); // Höhe in Pixeln
var ch: int64 := ImageGetChannels(img); // immer 4
// Pixel-Wert als 0xRRGGBBAA
var px: int64 := ImagePixelAt(img, x, y);
var r: int64 := (px >> 24) & 255;
var g: int64 := (px >> 16) & 255;
var b: int64 := (px >> 8) & 255;
var a: int64 := px & 255;
Core-API (std.image.core)
Für direkten Zugriff auf das Struct oder wenn ein Bild programmatisch erzeugt werden soll:
Allokation
// Alloziert GrfImage-Struct + RGBA-Pixel-Buffer (w*h*4 Bytes).
// Gibt 0 bei ungültigen Dimensionen oder OOM zurück.
var img: int64 := GrfImageAlloc(w, h);
// Freigabe
GrfImageFree(img);
Pixel-Operationen
// Lesen: gibt 0xRRGGBBAA zurück
var px: int64 := GrfImageGetPixel(img, x, y);
// Schreiben: rgba = 0xRRGGBBAA
GrfImageSetPixel(img, x, y, rgba);
// Alle Pixel mit einer Farbe füllen
GrfImageClear(img, 0xFF0000FF); // vollständig rot, volle Deckkraft
Format-Erkennung
// Mindestens 4 Bytes (WebP/AVIF brauchen 12).
// Gibt GRF_FMT_* zurück.
var fmt: int64 := GrfDetectFormat(buf, len);
if (fmt == GRF_FMT_PNG) {
PngDecode(buf, len, img);
}
Format-spezifische Decoder
Alle Decoder haben dieselbe Signatur:
// buf: Pointer auf Bildaten im Speicher
// len: Länge des Puffers in Bytes
// img: vorher alloziertes GrfImage (GrfImageAlloc oder leer via alloc(GRF_SIZE))
// Rückgabe: 1 = Erfolg, 0 = Fehler
fn XxxDecode(buf: int64, len: int64, img: int64): int64;
| Funktion | Unit | Format |
|---|---|---|
BmpDecode | std.image.bmp | Windows-Bitmap |
PngDecode | std.image.png | Portable Network Graphics |
JpegDecode | std.image.jpeg | JPEG / JFIF |
GifDecode | std.image.gif | Graphics Interchange Format |
TiffDecode | std.image.tiff | TIFF (LE und BE) |
WebpDecode | std.image.webp | WebP |
AvifDecode | std.image.avif | AVIF / AV1-basiert |
std.image.image importiert alle Format-Units automatisch; wer nur einen bestimmten Decoder benötigt, kann die jeweilige Unit direkt importieren.
Quelldateien
| Datei | Inhalt |
|---|---|
std/image/core.lyx | GRF-00: GrfImage-Struct, Allokation, Pixel-Zugriff, Format-Erkennung |
std/image/image.lyx | GRF-08: Unified Facade (ImageDecode, ImageDecodeFromMem, Accessoren) |
std/image/bmp.lyx | GRF-01: BMP-Decoder |
std/image/png.lyx | GRF-02: PNG-Decoder |
std/image/jpeg.lyx | GRF-03: JPEG-Decoder |
std/image/gif.lyx | GRF-04: GIF-Decoder |
std/image/tiff.lyx | GRF-05: TIFF-Decoder |
std/image/webp.lyx | GRF-06: WebP-Decoder |
std/image/avif.lyx | GRF-07: AVIF-Decoder |
Letzte Aktualisierung: 2026-06-15
