====== std.pdf.imagefile — Bilder aus Dateien ins PDF ======
''import std.pdf.imagefile;''
Eine einzige Funktion: ein Bild aus einer **Datei** laden und als XObject im Dokument anmelden. Das Dekodieren übernimmt ''std.image''; die Unit setzt nur beides zusammen und kürzt dabei die Kanäle auf das, was PDF kennt.
→ [[lyx_-_programmiersprache:units:pdf:image|std.pdf.image]] · [[lyx_-_programmiersprache:units:pdf|std.pdf]]
----
===== Funktion =====
^ Signatur ^ Rückgabe ^ Bedeutung ^
| ''PdfAddImageFile(doc: int64, path: pchar): int64'' | Bildindex ab 0, oder ''-1'' | Datei dekodieren und wie ''PdfAddImage'' anmelden. Der Index geht an ''PdfDrawImage'' |
^ Kanäle im Bild ^ Verhalten ^
| 1 (Graustufen) | direkt übernommen |
| 3 (RGB) | direkt übernommen |
| 4 (RGBA) | **auf RGB gekürzt — der Alphakanal wird verworfen** |
| 2 (Grau + Alpha) | ''-1'' |
> **Durchsichtige Bereiche werden deckend.** PDF-DeviceRGB kennt keinen Alphakanal; der richtige Weg wäre eine SMask, und die gibt es hier noch nicht. Ein halb umgesetzter Alphakanal wäre schlechter als eine benannte Grenze — deshalb steht sie hier.
>
> Grau + Alpha fällt aus demselben Grund auf ''-1'' durch: den Alphakanal stillschweigend als Grauwert zu nehmen wäre schlimmer als eine Fehlermeldung.
===== Beispiel =====
import std.pdf;
import std.pdf.imagefile;
import std.io;
import std.alloc;
fn main(): int64 {
var doc: int64 := PdfNew();
var page: int64 := PdfAddPage(doc, 595.0, 842.0); // A4 in Punkten
// 1. Rohe Pixel: 4x4 Graustufen-Verlauf
var n: int64 := 4 * 4;
var px: int64 := alloc(n);
var i: int64 := 0;
while (i < n) { poke8(px + i, (i * 16) & 255); i := i + 1; }
var idx1: int64 := PdfAddImage(doc, px, 4, 4, 1);
Print("PdfAddImage (grau) : "); PrintLn(IntToStr(idx1));
// 2. Bild aus einer Datei
var idx2: int64 := PdfAddImageFile(doc, "rot.png");
Print("PdfAddImageFile : "); PrintLn(IntToStr(idx2));
// 3. Datei gibt es nicht
var idx3: int64 := PdfAddImageFile(doc, "fehlt.png");
Print("fehlende Datei : "); PrintLn(IntToStr(idx3));
if (idx1 >= 0) { PdfDrawImage(doc, page, idx1, 72.0, 700.0, 100.0, 100.0); }
if (idx2 >= 0) { PdfDrawImage(doc, page, idx2, 200.0, 700.0, 100.0, 100.0); }
PdfSave(doc, "bild.pdf");
free(px, n);
PrintLn("PDF geschrieben");
return 0;
}
Mit einem 8×8-PNG als ''rot.png'' im Arbeitsverzeichnis:
PdfAddImage (grau) : 0
PdfAddImageFile : 1
fehlende Datei : -1
PDF geschrieben
Die Indizes werden fortlaufend vergeben (0, dann 1) — sie sind die Kennung für ''PdfDrawImage''. Die fehlende Datei liefert ''-1'', und das Programm zeichnet sie schlicht nicht: die Abfrage ''idx >= 0'' vor dem Zeichnen ist der ganze Fehlerpfad.
Höchstens **16 Bilder** je Dokument (''PDF_INITIAL_IMAGE_CAP''); darüber gibt ''PdfAddImage'' ebenfalls ''-1'' zurück.
----
Letzte Aktualisierung: 2026-09-01 — Seite neu angelegt aus ''std/pdf/imagefile.lyx''; Beispiel mit ''lyxc 1.1.16A'' gebaut, ausgeführt und das erzeugte PDF geprüft.