Start · Sprachen · PHP · Referenz · ps_open_image

ps_open_image

Funktion

Liest Bilddaten in ein PostScript-Dokument ein, sodas das Bild später mit <code>ps_place_image</code> platziert werden kann.

Kategorie: misc

Signatur

ps_open_image(resource $psdoc, string $type, string $source, string $data, float $length, int $width, int $height, int $components, int $bpc, string $params): int

Beschreibung

ps_open_image ist Teil der PHP-PostScript-Erweiterung (ps) und ermöglicht es, Bilddaten direkt aus einem String in ein PostScript-Dokument einzulesen. Das Bild wird nicht sofort gerendert, sondern zunächst intern registriert und erhält eine numerische ID, über die es später beliebig oft mit ps_place_image positioniert werden kann.

Im Gegensatz zu ps_open_image_file, das eine Datei als Quelle erwartet, übergibt man bei ps_open_image die rohen Bilddaten als String. Das ist besonders nützlich, wenn die Bilddaten bereits im Speicher vorliegen – zum Beispiel nach einem Datenbankaufruf oder einer HTTP-Antwort – und kein temporäres Schreiben auf die Festplatte erwünscht ist.

Unterstützte Bildtypen sind typischerweise png, jpeg und eps. Die Parameter width, height, components und bpc müssen exakt mit den tatsächlichen Bildattributen übereinstimmen; fehlerhafte Angaben führen zu korrumpierter PostScript-Ausgabe.

Nach der Verwendung sollte das Bild mit ps_close_image wieder freigegeben werden, um Speicher zu entleeren.

Parameter

Name Typ Default Beschreibung
$psdoc Pflicht resource Die PostScript-Dokumentressource, wie sie von ps_new zurückgegeben wird.
$type Pflicht string Der Bildtyp als Zeichenkette, z. B. 'png', 'jpeg' oder 'eps'.
$source Pflicht string Quelle der Bilddaten. Üblicherweise 'memory' für im Speicher vorliegende Daten.
$data Pflicht string Die rohen Binärdaten des Bildes als PHP-String.
$length Pflicht float Die Länge der Bilddaten in Bytes. Sollte mit strlen($data) übereinstimmen.
$width Pflicht int Die Breite des Bildes in Pixeln.
$height Pflicht int Die Höhe des Bildes in Pixeln.
$components Pflicht int Anzahl der Farbkomponenten: 1 für Graustufen, 3 für RGB, 4 für CMYK.
$bpc Pflicht int Bits pro Farbkanal, typischerweise 8.
$params Pflicht string Zusätzliche Parameter als Zeichenkette. Kann leer sein, wenn keine weiteren Optionen benötigt werden.

Rückgabewert

Typ
int
Beschreibung
Gibt eine positive Integer-ID zurück, über die das Bild mit ps_place_image referenziert werden kann. Im Fehlerfall wird 0 zurückgegeben.

Beispiele

JPEG aus Datei in PostScript einbetten

<?php
$ps = ps_new();
ps_open_file($ps, '/tmp/ausgabe.ps');
ps_begin_page($ps, 595, 842);

// JPEG-Daten aus Datei lesen
$bildDaten = file_get_contents('/pfad/zum/bild.jpg');
$bildInfo  = getimagesize('/pfad/zum/bild.jpg');

$bildId = ps_open_image(
    $ps,
    'jpeg',
    'memory',
    $bildDaten,
    strlen($bildDaten),
    $bildInfo[0],  // Breite
    $bildInfo[1],  // Höhe
    3,             // RGB
    8,             // Bits pro Kanal
    ''
);

if ($bildId > 0) {
    // Bild bei Position (50, 700) mit 200x150 Punkt platzieren
    ps_place_image($ps, $bildId, 50, 700, 1.0);
    ps_close_image($ps, $bildId);
} else {
    echo 'Fehler beim Einlesen des Bildes.';
}

ps_end_page($ps);
ps_close($ps);
ps_delete($ps);
?>

Bild mehrfach auf einer Seite platzieren

<?php
$ps = ps_new();
ps_open_file($ps, '/tmp/mehrfach.ps');
ps_begin_page($ps, 595, 842);

$bildDaten = file_get_contents('/pfad/zum/logo.jpg');
[$breite, $hoehe] = getimagesize('/pfad/zum/logo.jpg');

$bildId = ps_open_image(
    $ps, 'jpeg', 'memory',
    $bildDaten, strlen($bildDaten),
    $breite, $hoehe, 3, 8, ''
);

if ($bildId > 0) {
    // Dasselbe Bild an drei verschiedenen Positionen
    ps_place_image($ps, $bildId, 50,  750, 0.5);
    ps_place_image($ps, $bildId, 200, 600, 0.5);
    ps_place_image($ps, $bildId, 350, 450, 0.5);
    ps_close_image($ps, $bildId);
}

ps_end_page($ps);
ps_close($ps);
ps_delete($ps);
?>

// Wichtig · Fallstricke

Achtung: Die Parameter width, height, components und bpc werden nicht automatisch aus den Bilddaten ermittelt – sie müssen manuell korrekt angegeben werden. Falsche Werte führen zu einem defekten PostScript-Dokument ohne Fehlermeldung.

Die ps-Erweiterung ist nicht standardmäßig in PHP enthalten und muss über PECL installiert werden (pecl install ps). Sie setzt die C-Bibliothek pslib voraus.

Für einfachere Fälle, bei denen das Bild als Datei vorliegt, ist ps_open_image_file bequemer, da die Bildmetadaten automatisch aus der Datei gelesen werden können.