2012-02-21 12 views
15

मैंने ImagePng() के साथ एक छवि बनाई है। मैं यह फाइल सिस्टम के लिए छवि को बचाने के लिए चाहते हैं, लेकिन जैसा कि बेस 64 एन्कोड इनलाइन छवि एक ही पृष्ठ पर यह उत्पादन करना चाहते हैं,PHP: ImagePng के साथ छवि बनाएं और base64_encode के साथ एक फ़ाइल में कनवर्ट करें?

print '<p><img src="data:image/png;base64,'.base64_encode(ImagePng($png)).'" alt="image 1" width="96" height="48"/></p>'; 

जो काम नहीं करता है की तरह।

क्या यह एक ही PHP फ़ाइल में संभव है?

अग्रिम धन्यवाद!

उत्तर

27

यहां चाल imagepng() से आउटपुट कैप्चर करने के लिए आउटपुट बफरिंग का उपयोग करने के लिए होगी, जो या तो ब्राउज़र या फ़ाइल में आउटपुट भेजती है। यह वापस नहीं करता है यह एक चर में संग्रहीत करने के लिए (या बेस 64 इनकोडिंग):

// Enable output buffering 
ob_start(); 
imagepng($png); 
// Capture the output 
$imagedata = ob_get_contents(); 
// Clear the output buffer 
ob_end_clean(); 

print '<p><img src="data:image/png;base64,'.base64_encode($imagedata).'" alt="image 1" width="96" height="48"/></p>'; 

यह the imagepng() docs.

5

जब साथ PHP का उपयोग मैं मुसीबत ob_get_contents का उपयोग कर() था में एक उपयोगकर्ता उदाहरण से अनुकूलित है AJAX, तो मैं करने की कोशिश की इस:

$id = generateID(); //Whereas this generates a random ID number 
$file="testimage".$id.".png"; 
imagepng($image, $file); 
imagedestroy($image); 
echo(base64_encode(file_get_contents($file))); 
unlink($file); 

इस सर्वर पर एक अस्थायी छवि फ़ाइल की बचत होती है और फिर इसे बाद यह इनकोडिंग और बाहर गूँजती है हटा दिया है।

0

यदि आप किसी स्पष्ट फ़ाइल को स्टोर नहीं करना चाहते हैं, और आप पहले से ही ob_start() का उपयोग किसी और चीज़ के लिए कर रहे हैं (इसलिए आप इस मामले के लिए ob_start का उपयोग बहुत से रिफैक्टरिंग के बिना नहीं कर सकते हैं), तो आप अपने स्वयं के स्ट्रीम रैपर को स्टोर कर सकते हैं एक चर के लिए एक स्ट्रीम आउटपुट।

आप एक नया स्ट्रीम रैपर पंजीकृत करने के लिए stream_wrapper_register का उपयोग करते हैं, और इसे stream_write विधि को उस वैरिएबल पर लिखने के लिए लागू करते हैं जिसका मूल्य आप बाद में पुनर्प्राप्त कर सकते हैं। फिर आप इस स्ट्रीम को पार करते हैं (वास्तव में आपको केवल इस स्ट्रीम के लिए यूआरआई पास करने की आवश्यकता है) imagepng पर। imagepng आपकी स्ट्रीम को बंद करना चाहते हैं, आपको परेशान नहीं करेंगे, जब तक कि आपका स्ट्रीम रैपर बंद होने पर डेटा को नष्ट नहीं करता है (stream_close विधि कहा जाता है)।

संबंधित मुद्दे