====== 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.
→ [[lyx_-_programmiersprache:units|Units-Übersicht]] · [[lyx_-_programmiersprache:start|Lyx-Sprache]]
----
===== Units =====
^ Unit ^ Code ^ Beschreibung ^
| [[lyx_-_programmiersprache:units:image:core|std.image.core]] | GRF-00 | ''GrfImage''-Struct, Pixel-Operationen, Format-Erkennung, Datei-I/O-Helper |
| [[lyx_-_programmiersprache:units:image:image|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