PHP पाठ – पाठ 4 – छवियों के साथ कार्य, GD2 लाइब्रेरी
पिछले पाठों में हमने सीखा कि डेटाबेस पर क्वेरी कैसे लिखी जाती हैं, इसलिए अब हम क्वेरी सिंटैक्स पर कम और अभ्यास पर अधिक ध्यान देंगे। हम PHP की अन्य क्षमताओं के साथ क्वेरी लेखन को संयोजित करेंगे — शुरुआत करेंगे *छवियों के प्रसंस्करण* से। पिछले एक पाठ में हमने पहले से ही फाइल अपलोड करना सीखा था, और हमारे पास एक Files
तालिका भी है जिसमें अपलोड की गई फाइलें संग्रहीत होती हैं। अब हम उसी तालिका में छवियाँ (images) अपलोड करेंगे। लेकिन पहले हमें सामग्री निर्माण फॉर्म में एक नया फ़ोटो अपलोड फ़ील्ड जोड़ना होगा।
$content .= '<label for="bodytext">संदेश:</label><br />'; $content .= '<textarea name="bodytext" id="bodytext"></textarea><br />'; $content .= '<label>फ़ाइल जोड़ें:</label><br /><input type="file" name="filename"><br />'; $content .= '<label>छवि जोड़ें:</label><br /><input type="file" name="image">';
अब हमें फ़ाइलों की प्रोसेसिंग लिखनी है। इसके लिए पहले हम अपनी Messages
तालिका में एक नया कॉलम जोड़ेंगे — इसमें हम अपलोड की गई छवि का fid
सहेजेंगे। जबकि स्वयं छवि के डेटा Files
तालिका में जाएंगे। इस नए कॉलम को image_fid
कहा जाएगा (प्रकार: INT(11), डिफ़ॉल्ट: NULL)। अब write()
मेथड में फॉर्म की प्रोसेसिंग जोड़ें:
if($_FILES["image"]["size"] > 1024*3*1024){ echo ("फ़ाइल का आकार तीन मेगाबाइट से अधिक है"); exit; } if(is_uploaded_file($_FILES["image"]["tmp_name"])){ move_uploaded_file($_FILES["image"]["tmp_name"], "./files/".$_FILES["filename"]["name"]); } else { echo("फ़ाइल अपलोड त्रुटि"); } $sql = 'INSERT INTO Files (filename, filepath, filemime, filesize, timestamp) VALUES ("'. $_FILES['image']['name'] . '", "files/' . $_FILES['image']['name'] . '", "'. $_FILES['image']['type'] .'", '. $_FILES['image']['size'] .', '. time() . ')'; mysql_query($sql);
यह प्रोसेसिंग साधारण फ़ाइल अपलोड जैसी ही है। आगे हम यह भी देखेंगे कि फ़ाइल प्रकार (file type) की जांच कैसे करें ताकि कोई PDF फ़ाइल “छवि” के रूप में अपलोड न कर सके।
अब हमारे पास दो फाइलें अपलोड होंगी — एक सामान्य और एक छवि। यहाँ $_POST
और $_FILES
का एक उदाहरण है:
Array ( [title] => test [bodytext] => example ) Array ( [filename] => Array ( [name] => ip.txt [type] => text/plain [tmp_name] => Y:\tmp\php2C5.tmp [error] => 0 [size] => 13 ) [image] => Array ( [name] => Coat_of_arms.png [type] => image/png [tmp_name] => Y:\tmp\php2C6.tmp [error] => 0 [size] => 393743 ) )
संदेश तालिका में नया INSERT
क्वेरी इस प्रकार होगा:
$sql = 'INSERT INTO Messages (title, bodytext, created, fid, image_fid) VALUES ("'. $p["title"] . '", "' . $p["bodytext"] . '", ' . time() . ', LAST_INSERT_ID()-1, LAST_INSERT_ID())';
यहाँ LAST_INSERT_ID()
का उपयोग अंतिम जोड़े गए फ़ाइल ID को निर्धारित करने के लिए किया गया है। क्योंकि सामान्य फ़ाइल छवि से पहले अपलोड होती है, इसलिए हम उससे 1 घटा देते हैं।
अब जब छवियाँ डेटाबेस में सहेजी जाती हैं, तो हम उन्हें प्रदर्शित कर सकते हैं। छवि प्रबंधन के लिए हम एक अलग क्लास बनाएँगे जिसका नाम होगा simpleImage. यह क्लास class
फ़ोल्डर में नए फ़ाइल simpleImage.php
में बनेगी।
<?php class simpleCMS { } ?>
अब हमारे पास छवियों के लिए एक नया क्लास है। अब इसमें आवश्यक मेथड जोड़ेंगे। लेकिन पहले PHP में क्लास प्रॉपर्टीज़ के बारे में समझते हैं।
PHP 5 में क्लास की प्रॉपर्टीज़
Public
public
से घोषित वेरिएबल को हम क्लास के बाहर से एक्सेस और बदल सकते हैं।
<?php $obj = new simpleCMS(); $obj->db = 'newDB'; ?>
Protected
protected
वेरिएबल केवल क्लास के अंदर या उसकी सबक्लास में ही एक्सेस की जा सकती है।
class simpleCMS { protected $db = 'testDB'; } $obj = new simpleCMS(); $obj->db = 'newDB'; // ❌ यह त्रुटि देगा
क्लास कंस्ट्रक्टर
क्लास कंस्ट्रक्टर ऑब्जेक्ट के निर्माण पर प्रारंभिक मान सेट करता है। हम इसका उपयोग छवि फ़ाइल के पथ को क्लास में पास करने के लिए करेंगे:
class simpleCMS { protected $path; public function __construct($image){ $this->path = $image; } }
अब जब हम simpleImage
ऑब्जेक्ट बनाते हैं, तो यह फ़ाइल पथ को अपने अंदर सहेजेगा।
छवियों का प्रदर्शन
सार्वजनिक रूप से छवियाँ दिखाने के लिए हम इस कोड का उपयोग करेंगे:
if(!empty($row['image_fid'])){ $sql = "SELECT * FROM Files WHERE fid=".$row['image_fid']; $image_query = mysql_query($sql) or die(mysql_error()); $image = mysql_fetch_array($image_query); $content .= '<div class="image">'; $image = new simpleImage($image['filepath']); $content .= $image->scale(100,100); $content .= '</div>'; unset($image); }
छवियों को स्केल करना (माप बदलना)
अब हम scale()
और scale_and_crop()
नामक दो फ़ंक्शन बनाएँगे — ये Drupal जैसी कार्यक्षमता देंगे।
public function scale($width,$height){} public function scale_and_crop($width,$height){}
पहले scale()
फ़ंक्शन बनाते हैं:
public function scale($width, $height){ $path = $this->path; $filepath = explode('/', $this->path); $filename = end($filepath); $filename = substr($filename, 0, -4); $filename = str_replace(' ', '_', $filename); $extenstion = substr($this->path, -4); switch ($extenstion){ case '.png': $srcImage = ImageCreateFromPNG($path); break; case '.jpg': $srcImage = ImageCreateFromJPEG($path); break; case '.gif': $srcImage = ImageCreateFromGIF($path); break; default: $srcImage = ImageCreateFromGIF($path); break; } $srcWidth = ImageSX($srcImage); $srcHeight = ImageSY($srcImage); $ratioWidth = $srcWidth / $width; $ratioHeight = $srcHeight / $height; if($ratioWidth < $ratioHeight){ $destWidth = $srcWidth / $ratioHeight; $destHeight = $height; } else { $destWidth = $width; $destHeight = $srcHeight / $ratioWidth; } $destImage = imagecreate($destWidth, $destHeight); ImageCopyResized($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight); imagejpeg($destImage, 'files/presets/'.$width.'_'.$height.'_'.$filename.'.jpg', 100); $newImagePath = 'files/presets/'.$width.'_'.$height.'_'.$filename.'.jpg'; ImageDestroy($srcImage); ImageDestroy($destImage); return '<img src="'.$newImagePath.'" width="'.$destWidth.'" height="'.$destHeight.'" />'; }
इस प्रकार हम छवि को नए आकार में सहेजते हैं और HTML के रूप में लौटाते हैं। फ़ोल्डर files/presets
पहले से मौजूद होना चाहिए और उस पर लिखने की अनुमति (chmod 777) होनी चाहिए।
क्रॉप और स्केल एक साथ
scale_and_crop()
फ़ंक्शन थोड़ा अलग है — यह छवि को काटकर सटीक आकार में लाता है:
public function scale_and_crop($width, $height){ $path = $this->path; ... $destImage = imagecreate($width, $height); imagecopyresampled($destImage, $srcImage, 0, 0, 0, 0, $width, $height, $newWidth, $newHeight); imagejpeg($destImage, 'files/presets/'.$width.'_'.$height.'_'.$filename.'.jpg', 100); $newImagePath = 'files/presets/'.$width.'_'.$height.'_'.$filename.'.jpg'; ImageDestroy($srcImage); ImageDestroy($destImage); return '<img src="'.$newImagePath.'" />'; }
अब सार्वजनिक प्रदर्शन में इस विधि को कॉल करें:
$content .= '<div class="image">'; $image = new simpleImage($image['filepath']); $content .= $image->scale_and_crop(100,100); $content .= '</div>';
इससे छवियाँ चौकोर (square) और समानुपातिक रूप से क्रॉप की हुई दिखाई देंगी।
दोनों तरीकों में छवियाँ "on the fly" बनाई जाती हैं, जो समय लेती हैं। आम तौर पर तैयार थंबनेल पथों को डेटाबेस में सहेजा जाता है ताकि हर बार पुनः निर्माण न करना पड़े।
हम इस कोर्स में उस उन्नत भाग को नहीं देखेंगे, क्योंकि आगे हम CMS निर्माण के लिए Zend Framework का उपयोग करेंगे। अभी हमारा उद्देश्य है — आपको PHP में छवियों के साथ काम करने की मूल बातें सिखाना।