2010-07-08 11 views
51

प्रस्तुत करना मैं एक PHP है कि एक पारदर्शी बिंदु की छवि धारा (PNG या GIF)PHP स्क्रिप्ट एक भी पारदर्शी पिक्सेल (PNG या GIF)

तुम मुझे एक आसान को इंगित किया जा सका उपयोग करने के लिए वापस आ जाएगी बनाने के लिए उपाय?

+2

बेहतर इस के साथ एक स्थिर फ़ाइल बनाने के लिए नहीं है? – mbq

+0

यदि यह ट्रैकिंग उद्देश्यों के लिए है, तो आप अपनी PHP स्क्रिप्ट बना सकते हैं जो ट्रैकिंग करता है लेकिन फिर सामान्य, खाली जीआईएफ पिक्सेल छवि को पढ़ने के लिए 'readfile' का उपयोग करें। –

+0

मार्टिन, हाँ यह ट्रैकिंग कर रहा है, लेकिन मैं एक फाइल से पढ़ना नहीं चाहता हूं। Sjoerd का समाधान बिल्कुल वही है जो मुझे चाहिए, लेकिन वैसे भी धन्यवाद! –

उत्तर

147

पारदर्शी 1x1 पीएनजी:

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

पारदर्शी 1x1 GIF: लोगों के प्रश्नों के लिए

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

मैं सोच रहा था, इसे कुछ भी गूंजने की आवश्यकता क्यों है? मेरे परीक्षणों में, भले ही पिक्सेल वापस नहीं किया गया हो, फिर भी php बीकन को ट्रैक करता है। – jerrymouse

+13

@jerrymouse यदि कोई छवि वापस नहीं आती है, तो ईमेल दर्शक उपयोगकर्ता को कुछ प्रकार का त्रुटि प्रतीक प्रदर्शित कर सकता है। – Brilliand

5

कुछ जवाब:

आप छवि की सामग्री प्रतिध्वनित करने के लिए किया है। हैडर दिखाता है कि आप टेक्स्ट नहीं लौट रहे हैं, लेकिन छवि। तो अगर आपने हेडर लौटाया है, तो यह सिर्फ एक हेडर है - कोई डेटा नहीं। फिर आप छवि के डेटा को मुद्रित करते हैं और किया जाता है, आप बस छवि भेजते हैं :)

पढ़ने की फ़ाइल अच्छी नहीं है, यह काम कर सकती है, लेकिन कच्चे डेटा को वापस करना बेहतर है जैसे कि सॉजर्ड द्वारा मुख्य उत्तर में दिखाया गया है। सिर्फ इसलिए कि आप एक पठन ऑपरेशन को बचाते हैं। डिस्क से पढ़ना धीमा कार्य है। आजकल यह एसएसडी डिस्क के साथ गति में वृद्धि हुई है, लेकिन फिर भी। डिस्क में कोई I/O बेहतर नहीं है।

मैं भी base64 डिकोड के बिना इस कोड की थी, लेकिन इस छवि को सफेद रंग है:

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

हो सकता है कि किसी को जानता है कि कैसे इस तरह के डेटा स्ट्रिंग के लिए किसी भी फ़ाइल बदलने के लिए?

13

PHP 5.4 और उच्चतर में hex2bin का उपयोग करना संभव है, जो बेस 64_डेकोड से लगभग दो गुना तेज है (नीचे खाली जीआईएफ फ़ाइल के साथ परीक्षण किया गया है)। उत्पादन छवियों कोड होगा:

पारदर्शी 1x1 पीएनजी:

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

पारदर्शी 1x1 GIF:

echo bin2hex(base64_decode($data)); 
:

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

आप आसानी से हेक्साडेसिमल में बेस 64 एन्कोडेड डेटा परिवर्तित कर सकते हैं

या एक फ़ाइल:

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

हालांकि, मेरे बेंचमार्क के अनुसार @Lukas Liesis द्वारा सुझाए गए देशी PHP एस्केप विधि का उपयोग बेस 64_decode से लगभग 12.5 गुना तेज है। और यह लगभग PHP के किसी भी संस्करण के साथ काम करेगा।यहाँ कोड के टुकड़े कर रहे हैं:

पारदर्शी 1x1 पीएनजी:

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

पारदर्शी 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"); 

इस तरह के एक स्ट्रिंग बनाना नियमित अभिव्यक्ति के साथ आसान है (के रूप में यह एक बार किया जाता है, यह 'नहीं करता है टी) तेजी से काम करना है:

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

या एक फ़ाइल से:

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

पहला पारदर्शी 1x1 पीएनजी: एक लापता अंत ब्रैकेट है:)); – popas

-1
लिनक्स में

आप कंसोल में टाइप करके रूपांतरित कर सकते हैं:

hexdump -v -e '"\\\x" 1/1 "%X"' image.gif; echo 
संबंधित मुद्दे