PHP-Skript zum Rendern eines einzelnen transparenten Pixels (PNG oder GIF)

Lesezeit: 4 Minuten

Ich muss eine PHP erstellen, die einen Bildstrom von einem transparenten Punkt (PNG oder GIF) zurückgibt.

Können Sie mir eine benutzerfreundliche Lösung nennen?

  • Ist es nicht besser, eine statische Datei damit zu erstellen?

    – mbq

    8. Juli 2010 um 12:12 Uhr

  • Wenn dies zu Tracking-Zwecken dient, könnten Sie Ihr PHP-Skript erstellen, das das Tracking durchführt, aber dann verwenden readfile um ein normales, leeres GIF-Pixelbild zu lesen.

    – Martin Bean

    8. Juli 2010 um 12:33 Uhr

  • Martin, ja, es ist Tracking, aber ich möchte nicht aus einer Datei lesen. Sjoerds Lösung ist genau das, was ich brauchte, aber trotzdem danke!

    Benutzer333306

    8. Juli 2010 um 13:05 Uhr

Benutzer-Avatar
Sjoerd

Transparentes 1×1-PNG:

header('Content-Type: image/png');
echo base64_decode('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=');

Transparentes 1×1-GIF:

header('Content-Type: image/gif');
echo base64_decode('R0lGODlhAQABAJAAAP8AAAAAACH5BAUQAAAALAAAAAABAAEAAAICBAEAOw==');

  • Ich habe mich gefragt, warum es überhaupt erforderlich ist, irgendetwas zu wiederholen? In meinen Tests verfolgt PHP immer noch das Beacon, selbst wenn das Pixel nicht zurückgegeben wird.

    – Jerrymaus

    11. April 2014 um 9:26 Uhr

  • @jerrymouse Wenn kein Bild zurückgegeben wird, zeigt der E-Mail-Viewer dem Benutzer möglicherweise eine Art Fehlersymbol an.

    – Brillant

    13. Mai 2014 um 18:59 Uhr

  • Wie könnten wir die Farbe eines solchen Bildes steuern?

    – Donquijote

    5. Januar 2019 um 20:39 Uhr

Benutzer-Avatar
Michail Bunkin

In PHP 5.4 und höher ist die Verwendung möglich hex2bin, was ungefähr zweimal schneller ist als base64_decode (getestet mit der leeren GIF-Datei unten). Der Code zum Ausgeben von Bildern wäre:

Transparentes 1×1-PNG:

header('Content-Type: image/png');
die(hex2bin('89504e470d0a1a0a0000000d494844520000000100000001010300000025db56ca00000003504c5445000000a77a3dda0000000174524e530040e6d8660000000a4944415408d76360000000020001e221bc330000000049454e44ae426082'));

Transparentes 1×1-GIF:

header('Content-Type: image/gif');
die(hex2bin('47494638396101000100900000ff000000000021f90405100000002c00000000010001000002020401003b'));

Sie können Base64-codierte Daten einfach in Hexadezimal umwandeln:

echo bin2hex(base64_decode($data));

Oder eine Datei:

echo bin2hex(base64_decode(file_get_contents($filename)));

Die Verwendung der von @Lukas Liesis vorgeschlagenen nativen PHP-Escape-Methode ist jedoch die schnellste, laut meinem Benchmark etwa 12,5-mal schneller als base64_decode. Und es würde mit praktisch jeder Version von PHP funktionieren. Hier sind die Codeschnipsel:

Transparentes 1×1-PNG:

header('Content-Type: image/png');
die("\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\x00\x00\x01\x00\x00\x00\x01\x01\x03\x00\x00\x00\x25\xdb\x56\xca\x00\x00\x00\x03\x50\x4c\x54\x45\x00\x00\x00\xa7\x7a\x3d\xda\x00\x00\x00\x01\x74\x52\x4e\x53\x00\x40\xe6\xd8\x66\x00\x00\x00\x0a\x49\x44\x41\x54\x08\xd7\x63\x60\x00\x00\x00\x02\x00\x01\xe2\x21\xbc\x33\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82");

Transparentes 1×1-GIF:

header('Content-Type: image/gif');
die("\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x90\x00\x00\xff\x00\x00\x00\x00\x00\x21\xf9\x04\x05\x10\x00\x00\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02\x04\x01\x00\x3b");

Das Erstellen eines solchen Strings ist mit regulären Ausdrücken einfach (da es einmal gemacht ist, muss es nicht schnell gehen):

echo preg_replace('/../','\\x\0',bin2hex($data));

Oder aus einer Datei:

echo preg_replace('/../','\\x\0',bin2hex(file_get_contents($filename)));

  • das erste transparente 1×1-PNG: hat eine fehlende Endklammer: ));

    – Stelianisch

    12. Februar 2017 um 20:51 Uhr

Benutzer-Avatar
Lukas Liese

Um die Fragen einiger Leute zu beantworten:

Sie müssen den Inhalt eines Bildes wiedergeben. Die Kopfzeile zeigt nur, dass Sie ein Bild anstelle von normalem Text an den Browser zurückgeben. Wenn Sie also nur einen Header zurückgeben, ist es nur ein Header – keine Daten. Allerdings Daten eines Bildes ausdrucken und fertig, Sie haben gerade ein Bild gesendet 🙂

Das Lesen einer Datei ist nicht gut, es könnte funktionieren, aber es ist besser, Rohdaten zurückzugeben, wie in der Hauptantwort von Sjoerd gezeigt. Auf diese Weise sparen Sie Zeit und Serverlast, da Sie keinen Lesevorgang verarbeiten müssen. Das Lesen von der Festplatte ist eine langsame Aufgabe. Im Laufe der Zeit hat sich das Lesen von der Festplatte mit SSD-Festplatten beschleunigt, aber No I/O to Disk ist immer noch besser.

Ich hatte diesen Code auch ohne Base64-Decodierung, aber dieses Bild hat weiße Farbe:

header('Content-Type: image/gif');
// 1x1px white gif
die("\x47\x49\x46\x38\x37\x61\x1\x0\x1\x0\x80\x0\x0\xfc\x6a\x6c\x0\x0\x0\x2a\x0\x0\x0\x0\x1\x0\x1\x0\x0\x2\x2\x44\x1\x0\x3b");

Vielleicht weiß jemand, wie man eine beliebige Datei in einen solchen Datenstring umwandelt?

Benutzer-Avatar
a_main

header('Content-Type: image/gif');
printf('%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%', 71, 73, 70, 56, 57, 97, 1, 0, 1, 0, 128, 255, 0, 192, 192, 192, 0, 0, 0, 33, 249, 4, 1, 0, 0, 0, 0, 44, 0, 0, 0, 0, 1, 0, 1, 0, 0, 2, 2, 68, 1, 0, 59);

Unter Linux können Sie es konvertieren, indem Sie in die Konsole eingeben:

hexdump -v -e '"\\\x" 1/1 "%X"' image.gif; echo

1333850cookie-checkPHP-Skript zum Rendern eines einzelnen transparenten Pixels (PNG oder GIF)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy