std.svg.image

Bilder in ein SVG einbetten. Alle Wege kodieren die Daten als Base64-Data-URI — eine Referenz auf eine externe Datei gibt es nicht.

Zwei Muster:

  • SvgImageFile schreibt das Bild einmal an Ort und Stelle in den Rumpf.
  • SvgAddImageJpeg/SvgAddImagePng/SvgAddImageRGB legen es in <defs> ab und liefern eine Bildnummer; SvgDrawImage und SvgDrawImageFit setzen es danach beliebig oft ein.

std.svg · std.svg.builder · std.svg.defs


Verwendung

import std.io;
import std.alloc;
import std.svg.builder;
import std.svg.elements;
import std.svg.image;

fn main(): int64 {
    var doc: int64 := SvgNew(400.0, 300.0);
    SvgSetPrettyPrint(doc, 1);

    // Datei lesen und an dieser Stelle einbetten (JPEG/PNG per Magic Bytes)
    SvgImageFile(doc, "logo.png", 50.0, 50.0, 200.0, 150.0);

    // RGB-Rohdaten: drei Byte je Pixel, zeilenweise
    var px: int64 := alloc(12);
    poke8(px, 255);     poke8(px + 1, 0);    poke8(px + 2, 0);
    poke8(px + 3, 0);   poke8(px + 4, 255);  poke8(px + 5, 0);
    poke8(px + 6, 0);   poke8(px + 7, 0);    poke8(px + 8, 255);
    poke8(px + 9, 255); poke8(px + 10, 255); poke8(px + 11, 0);

    var img: int64 := SvgAddImageRGB(doc, px, 2, 2);   // liefert die Bildnummer
    SvgDrawImage(doc, img, 10.0, 10.0, 32.0, 32.0);
    SvgDrawImageFit(doc, img, 300.0, 10.0, 64.0, 64.0);

    Print(SvgToString(doc)); Print("\n");
    SvgFree(doc);
    return 0;
}

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="300">
  <defs>
    <image id="img0" href="data:image/png;base64,iVBORw0KGgo…"/>
  </defs>
  <image href="data:image/png;base64,iVBORw0KGgo…"/>
  <use href="#img0" x="10" y="10" width="32" height="32"/>
  <use href="#img0" x="300" y="10" width="64" height="64"/>
</svg>

(Die Base64-Ströme sind hier gekürzt.)

Ist die Datei nicht lesbar, tut SvgImageFile nichts und meldet nichts — der Aufruf hinterlässt keine Spur im Dokument. Ein Blick auf die Ausgabe ist damit die einzige Prüfung.


Funktionen

Signatur Sichtbarkeit Beschreibung
SvgImageFile(doc: int64, path: pchar, x: f64, y: f64, w: f64, h: f64): void pub Datei lesen und an dieser Stelle als Data-URI einbetten
SvgAddImageJpeg(doc: int64, path: pchar): int64 pub JPEG in <defs> ablegen, liefert die Bildnummer
SvgAddImagePng(doc: int64, path: pchar): int64 pub PNG in <defs> ablegen
SvgAddImageRGB(doc: int64, ptr: int64, w: int64, h: int64): int64 pub RGB-Rohdaten zu PNG wandeln und ablegen
SvgDrawImage(doc: int64, imgId: int64, x: f64, y: f64, w: f64, h: f64): void pub Abgelegtes Bild einsetzen
SvgDrawImageFit(doc: int64, imgId: int64, x: f64, y: f64, mw: f64, mh: f64): void pub Einsetzen und in den Rahmen einpassen

Nicht vorhanden: SvgImageEmbed, SvgImageBase64, SvgImageFromRGB, SvgImageSymbol, SvgBase64Encode und SvgPngFromRGB — frühere Fassungen dieser Seite führten sie samt Style-Parameter auf.

Letzte Aktualisierung: 2026-08-19 — Seite gegen die echten Signaturen neu geschrieben; Beispiel mit lyxc 1.1.3I übersetzt und gegen ein erzeugtes 2×2-PNG ausgeführt, Ausgabe übernommen (Base64 gekürzt).