====== 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