Start · Sprachen · PHP · Referenz · ps_open_memory_image

ps_open_memory_image

Funktion

Wandelt ein GD-Bild-Ressource in ein für PS-Dokumente (PostScript) platzierbares Bild um und gibt eine Bild-ID zurück.

Kategorie: misc

Signatur

ps_open_memory_image(resource $psdoc, int $gd): int

Beschreibung

ps_open_memory_image() gehört zur ps-Erweiterung (PostScript) und ermöglicht es, ein mit der GD-Bibliothek erzeugtes oder geladenes Bild direkt in ein PostScript-Dokument einzubetten. Die Funktion liest die Bilddaten aus der GD-Ressource im Speicher aus und registriert das Bild intern im PS-Dokument.

Das Bild kann anschließend mit ps_place_image() an einer beliebigen Stelle im PostScript-Dokument positioniert werden. Die zurückgegebene Bild-ID wird dabei als Referenz verwendet. Wenn das Bild nicht mehr benötigt wird, sollte es mit ps_close_image() freigegeben werden, um Speicher zu sparen.

Typische Anwendungsfälle sind die dynamische Generierung von PostScript-Dokumenten mit eingebetteten Grafiken, z. B. Berichte mit Diagrammen oder Logos, die zunächst mit GD erzeugt und dann in PDF/PS exportiert werden.

Hinweis: Diese Funktion erfordert, dass sowohl die ps-Erweiterung als auch die GD-Erweiterung in PHP aktiviert sind. Die ps-Erweiterung ist nicht standardmäßig aktiviert und muss separat installiert werden.

Parameter

Name Typ Default Beschreibung
$psdoc Pflicht resource Die Ressource des PostScript-Dokuments, die zuvor mit ps_new() und ps_open_file() erzeugt wurde.
$gd Pflicht int Die Ressource (oder in neueren PHP-Versionen das GdImage-Objekt) des GD-Bildes, das in das PS-Dokument eingebettet werden soll. Das Bild muss zuvor mit einer GD-Funktion wie imagecreatefrompng(), imagecreatefromjpeg() oder imagecreate() erzeugt worden sein.

Rückgabewert

Typ
int
Beschreibung
Gibt eine Bild-ID als Integer zurück, die für nachfolgende Aufrufe von ps_place_image() und ps_close_image() verwendet werden kann. Im Fehlerfall wird 0 zurückgegeben.

Beispiele

GD-Bild in PostScript-Dokument einbetten

<?php
// GD-Bild laden
$gdImage = imagecreatefrompng('logo.png');

// PostScript-Dokument erstellen
$ps = ps_new();
ps_open_file($ps, 'output.ps');
ps_set_info($ps, 'Creator', 'PHP ps_open_memory_image Beispiel');
ps_begin_page($ps, 595, 842); // DIN A4

// GD-Bild in PS-Dokument registrieren
$imageId = ps_open_memory_image($ps, $gdImage);

if ($imageId !== 0) {
    // Bild auf der Seite platzieren (x=100, y=700, Breite=200, Höhe=100)
    ps_place_image($ps, $imageId, 100, 700, 1.0);
    // Bild-Ressource freigeben
    ps_close_image($ps, $imageId);
} else {
    echo 'Fehler beim Öffnen des Bildes.';
}

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

// GD-Ressource freigeben
imagedestroy($gdImage);

echo 'PostScript-Dokument wurde erstellt.';
?>
PostScript-Dokument wurde erstellt.

Dynamisch erzeugtes GD-Bild einbetten

<?php
// Dynamisches GD-Bild erzeugen
$gdImage = imagecreatetruecolor(300, 100);
$blau = imagecolorallocate($gdImage, 0, 0, 255);
$weiss = imagecolorallocate($gdImage, 255, 255, 255);
imagefilledrectangle($gdImage, 0, 0, 299, 99, $blau);
imagestring($gdImage, 5, 50, 35, 'Hallo PS!', $weiss);

// PostScript-Dokument erzeugen
$ps = ps_new();
ps_open_file($ps, 'dynamic.ps');
ps_begin_page($ps, 595, 842);

$imageId = ps_open_memory_image($ps, $gdImage);
if ($imageId !== 0) {
    ps_place_image($ps, $imageId, 50, 600, 1.0);
    ps_close_image($ps, $imageId);
}

ps_end_page($ps);
ps_close($ps);
ps_delete($ps);
imagedestroy($gdImage);

echo 'Dynamisches Bild in PS eingebettet.';
?>
Dynamisches Bild in PS eingebettet.

// Wichtig · Fallstricke

Erweiterungsabhängigkeit: Die Funktion setzt voraus, dass die ps-Erweiterung (pecl/ps) sowie die GD-Erweiterung aktiviert sind. Ohne diese Erweiterungen steht die Funktion nicht zur Verfügung.

Ressourcen freigeben: Jedes mit ps_open_memory_image() geöffnete Bild sollte nach der Verwendung mit ps_close_image() geschlossen werden, um Speicher freizugeben. Die GD-Ressource sollte zusätzlich mit imagedestroy() freigegeben werden.

Farbmodus: Es empfiehlt sich, Truecolor-Bilder (imagecreatetruecolor()) zu verwenden, da palettenbasierte Bilder möglicherweise nicht korrekt eingebettet werden.