2010-07-08 6 views
51

devo creare un PHP che restituirà un flusso di immagini di un punto trasparente (PNG o GIF)script PHP per rendere un singolo pixel trasparente (PNG o GIF)

Mi può puntare a un facile da usare soluzione?

+2

Non è meglio fare un file statico con questo? – mbq

+0

Se questo è per il monitoraggio, è possibile creare il proprio script PHP che esegue il tracciamento, ma poi usare 'readfile' per leggere un'immagine normale e vuota dei pixel GIF. –

+0

Martin, sì è il monitoraggio, ma non voglio leggere da un file. La soluzione di Sjoerd è esattamente ciò di cui avevo bisogno, ma grazie comunque! –

risposta

147

trasparente 1x1 PNG:

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

trasparente 1x1 GIF:

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

Mi stavo chiedendo, perché è necessario fare eco a qualcosa? Nei miei test, anche se il pixel non viene restituito, php tiene ancora traccia del beacon. – jerrymouse

+13

@jerrymouse Se non viene restituita alcuna immagine, il visualizzatore e-mail potrebbe visualizzare una sorta di simbolo di errore per l'utente. – Brilliand

5

alcune risposte alle domande della gente:

bisogna eco contenuto di un'immagine. L'intestazione mostra che non stai restituendo il testo, ma l'immagine. Quindi se hai restituito l'intestazione, è solo un'intestazione - nessun dato. Quindi stampi i dati dell'immagine e fatto, ti basta inviare l'immagine :)

leggere il file non è buono, potrebbe funzionare, ma è meglio restituire i dati grezzi come mostrato nella risposta principale di Sjoerd. Solo perché si salva un'operazione di lettura. La lettura dal disco è un'attività lenta. Oggigiorno è aumentata la velocità con i dischi SSD, ma ancora. Nessun I/O su disco è migliore.

ho avuto questo codice anche senza base64 decodifica, ma questa immagine non ha colore bianco:

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"); 

Forse qualcuno sa come convertire qualsiasi file per tale stringa di dati?

13

In PHP 5.4 e versioni successive è possibile utilizzare hex2bin, che è all'incirca due volte più veloce di base64_decode (testato con il file GIF vuoto di seguito). Il codice per trasmettere le immagini potrebbe essere:

trasparente 1x1 PNG:

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

trasparente 1x1 GIF:

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

è possibile convertire facilmente base64 dati codificati in esadecimale:

echo bin2hex(base64_decode($data)); 

O un file:

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

Tuttavia, utilizzando il metodo nativo di escape PHP suggerito da @Lukas Liesis è il più veloce, circa 12,5 volte più veloce rispetto a base64_decode, secondo il mio benchmark. E funzionerebbe praticamente con qualsiasi versione di PHP.Qui ci sono i frammenti di codice:

trasparente 1x1 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"); 

trasparente 1x1 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"); 

La creazione di un tale stringa è facile con le espressioni regolari (come viene fatto una volta, esso doesn' t devono lavorare velocemente):

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

o da un file:

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

il primo PNG 1x1 trasparente: ha una parentesi finale mancante:)); – popas

-1

In Linux è possibile convertire digitando in console:

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