PHP
जीडी के साथ इमेज प्रोसेसिंग
खोज…
टिप्पणियों
header("Content-Type: $mimeType");
का उपयोग करते समय header("Content-Type: $mimeType");
और छवि image____
केवल आउटपुट के लिए एक छवि उत्पन्न करने के लिए, और कुछ भी उत्पादन करने के लिए सुनिश्चित हो, एक खाली लाइन के बाद भी ध्यान दें ?>
। (जो नीचे ट्रैक करने के लिए एक कठिन 'बग' हो सकता है - आपको कोई छवि नहीं मिलती है और कोई सुराग नहीं है कि क्यों।) सामान्य सलाह को शामिल नहीं करना है?> यहां बिल्कुल भी नहीं।
एक छवि बनाना
रिक्त छवि बनाने के लिए, imagecreatetruecolor
फ़ंक्शन का उपयोग करें:
$img = imagecreatetruecolor($width, $height);
$img
अब $width
x $height
पिक्सेल वाले छवि संसाधन के लिए एक संसाधन चर है। ध्यान दें कि चौड़ाई बाएं से दाएं और ऊंचाई ऊपर से नीचे तक गिना जाता है।
छवि निर्माण कार्य छवि निर्माण कार्यों से भी बनाए जा सकते हैं, जैसे:
-
imagecreatefrompng
-
imagecreatefromjpeg
- अन्य
imagecreatefrom*
कार्य करता है।
छवि संसाधनों को बाद में मुक्त किया जा सकता है जब उनके लिए अधिक संदर्भ नहीं होते हैं। हालाँकि, स्मृति को तुरंत मुक्त करने के लिए (यह महत्वपूर्ण हो सकता है यदि आप कई बड़ी छवियों को संसाधित कर रहे हैं), इमेज पर imagedestroy()
का उपयोग करते हुए जब यह अब उपयोग नहीं किया जाता है तो यह एक अच्छा अभ्यास हो सकता है।
imagedestroy($image);
एक छवि परिवर्तित करना
छवि रूपांतरण द्वारा बनाई गई छवियां छवि को तब तक संशोधित नहीं करती हैं जब तक आप इसे आउटपुट नहीं करते हैं। इसलिए, एक छवि कनवर्टर कोड की तीन पंक्तियों के रूप में सरल हो सकता है:
function convertJpegToPng(string $filename, string $outputFile) {
$im = imagecreatefromjpeg($filename);
imagepng($im, $outputFile);
imagedestroy($im);
}
छवि आउटपुट
image*
फ़ंक्शन का उपयोग करके एक छवि बनाई जा सकती है, जहां *
फ़ाइल प्रारूप है।
वे इस वाक्य रचना में आम हैं:
bool image___(resource $im [, mixed $to [ other parameters]] )
किसी फ़ाइल में सहेजा जा रहा है
यदि आप छवि को किसी फ़ाइल में सहेजना चाहते हैं, तो आप $to
रूप में फ़ाइल नाम, या एक खुली हुई फ़ाइल स्ट्रीम पास कर सकते हैं। यदि आप एक स्ट्रीम पास करते हैं, तो आपको इसे बंद करने की आवश्यकता नहीं है, क्योंकि GD अपने आप इसे बंद कर देगा।
उदाहरण के लिए, PNG फ़ाइल को सहेजने के लिए:
imagepng($image, "/path/to/target/file.png");
$stream = fopen("phar://path/to/target.phar/file.png", "wb");
imagepng($image2, $stream);
// Don't fclose($stream)
fopen
का उपयोग करते समय, t
ध्वज के बजाय b
ध्वज का उपयोग करना सुनिश्चित करें, क्योंकि फ़ाइल एक बाइनरी आउटपुट है।
इसे करने के लिए fopen("php://temp", $f)
या fopen("php://memory", $f)
करने की कोशिश न करें। चूंकि कॉल के बाद फ़ंक्शन द्वारा स्ट्रीम को बंद कर दिया जाता है, आप इसे आगे उपयोग करने में असमर्थ होंगे, जैसे कि इसकी सामग्री को पुनः प्राप्त करना।
HTTP प्रतिक्रिया के रूप में आउटपुट
यदि आप इस छवि को सीधे छवि की प्रतिक्रिया के रूप में वापस करना चाहते हैं (जैसे गतिशील बैज बनाने के लिए), तो आपको दूसरे तर्क के रूप में कुछ भी (या null
) पास करने की आवश्यकता नहीं है। हालाँकि, HTTP प्रतिक्रिया में, आपको अपनी सामग्री प्रकार निर्दिष्ट करने की आवश्यकता है:
header("Content-Type: $mimeType");
$mimeType
उस MIME प्रकार का स्वरूप है जिसे आप वापस कर रहे हैं। उदाहरणों में image/png
, image/gif
और image/jpeg
।
एक चर में लिखना
एक चर में लिखने के दो तरीके हैं।
OB (आउटपुट बफरिंग) का उपयोग करना
ob_start();
imagepng($image, null, $quality); // pass null to supposedly write to stdout
$binary = ob_get_clean();
स्ट्रीम रैपर का उपयोग करना
आपके पास कई कारण हो सकते हैं कि आप आउटपुट बफ़रिंग का उपयोग नहीं करना चाहते हैं। उदाहरण के लिए, आपके पास पहले से ही ओबी हो सकता है। इसलिए, एक विकल्प की आवश्यकता है।
stream_wrapper_register
फ़ंक्शन का उपयोग करके, एक नई स्ट्रीम रैपर पंजीकृत किया जा सकता है। इसलिए, आप छवि आउटपुट फ़ंक्शन में एक स्ट्रीम पास कर सकते हैं, और बाद में इसे पुनः प्राप्त कर सकते हैं।
<?php
class GlobalStream{
private $var;
public function stream_open(string $path){
$this->var =& $GLOBALS[parse_url($path)["host"]];
return true;
}
public function stream_write(string $data){
$this->var .= $data;
return strlen($data);
}
}
stream_wrapper_register("global", GlobalStream::class);
$image = imagecreatetruecolor(100, 100);
imagefill($image, 0, 0, imagecolorallocate($image, 0, 0, 0));
$stream = fopen("global://myImage", "");
imagepng($image, $stream);
echo base64_encode($myImage);
इस उदाहरण में, GlobalStream
वर्ग संदर्भ चर में कोई इनपुट लिखता है (अर्थात अप्रत्यक्ष रूप से दिए गए नाम के वैश्विक चर में लिखें)। वैश्विक चर को बाद में सीधे प्राप्त किया जा सकता है।
ध्यान देने योग्य कुछ विशेष बातें हैं:
- एक पूरी तरह से लागू धारा आवरण वर्ग की तरह दिखना चाहिए इस है, लेकिन साथ परीक्षण के अनुसार
__call
जादू विधि, केवलstream_open
,stream_write
औरstream_close
आंतरिक कार्यों से कहा जाता है। -
fopen
कॉल में किसी भी झंडे की आवश्यकता नहीं है, लेकिन आपको कम से कम एक खाली स्ट्रिंग पास करना चाहिए। इसका कारण यह है किfopen
फ़ंक्शन इस तरह के पैरामीटर की अपेक्षा करता है, और भले ही आप इसे अपनेstream_open
कार्यान्वयन में उपयोग न करें, फिर भी एक डमी की आवश्यकता है। - परीक्षणों के अनुसार,
stream_write
को कई बार कहा जाता है। उपयोग करने के लिए याद रखें.=
(संघनन कार्य), नहीं=
(प्रत्यक्ष चर असाइनमेंट)।
उदाहरण उपयोग
<img>
HTML टैग में, बाहरी लिंक का उपयोग करने के बजाय एक छवि सीधे प्रदान की जा सकती है:
echo '<img src="data:image/png;base64,' . base64_encode($binary) . '">';
इमेज क्रॉपिंग और रिसाइज़िंग
यदि आपके पास एक छवि है और एक नई छवि बनाना चाहते हैं, तो नए आयामों के साथ, आप imagecopyresampled
फ़ंक्शन का उपयोग कर सकते हैं:
पहले वांछित आयामों के साथ एक नई image
बनाएं:
// new image
$dst_img = imagecreatetruecolor($width, $height);
और मूल छवि को एक चर में संग्रहीत करें। ऐसा करने के लिए, आप एक createimagefrom*
फ़ंक्शंस का उपयोग कर सकते हैं जहां * के लिए खड़ा है:
- jpeg
- gif
- png
- तार
उदाहरण के लिए:
//original image
$src_img=imagecreatefromstring(file_get_contents($original_image_path));
अब, imagecopyresamped द्वारा नई छवि (dst_img) में मूल छवि (src_img) के सभी (या भाग) की प्रतिलिपि imagecopyresampled
:
imagecopyresampled($dst_img, $src_img,
$dst_x ,$dst_y, $src_x, $src_y,
$dst_width, $dst_height, $src_width, $src_height);
src_*
और dst_*
आयाम सेट करने के लिए, नीचे दी गई छवि का उपयोग करें:
अब, यदि आप पूरे स्रोत (प्रारंभिक) छवि की प्रतिलिपि बनाना चाहते हैं, तो पूरे गंतव्य क्षेत्र में (कोई फ़सल नहीं):
$src_x = $src_y = $dst_x = $dst_y = 0;
$dst_width = $width;// width of new image
$dst_height = $height; //height of new image
$src_width = imagesx($src_img); //width of initial image
$src_height = imagesy($src_img); //height of initial image