logo

एक्स्ट्रा ब्लॉक टाइप्स (EBT) - नया लेआउट बिल्डर अनुभव❗

एक्स्ट्रा ब्लॉक टाइप्स (EBT) - स्टाइलिश, कस्टमाइज़ेबल ब्लॉक टाइप्स: स्लाइडशो, टैब्स, कार्ड्स, एकॉर्डियन्स और कई अन्य। बैकग्राउंड, DOM बॉक्स, जावास्क्रिप्ट प्लगइन्स के लिए बिल्ट-इन सेटिंग्स। आज ही लेआउट बिल्डिंग का भविष्य अनुभव करें।

डेमो EBT मॉड्यूल्स EBT मॉड्यूल्स डाउनलोड करें

❗एक्स्ट्रा पैराग्राफ टाइप्स (EPT) - नया पैराग्राफ्स अनुभव

एक्स्ट्रा पैराग्राफ टाइप्स (EPT) - एनालॉजिकल पैराग्राफ आधारित मॉड्यूल्स का सेट।

डेमो EPT मॉड्यूल्स EPT मॉड्यूल्स डाउनलोड करें

स्क्रॉल

PHP पाठ – पाठ 4 – छवियों के साथ कार्य, GD2 लाइब्रेरी

07/10/2025, by Ivan

पिछले पाठों में हमने सीखा कि डेटाबेस पर क्वेरी कैसे लिखी जाती हैं, इसलिए अब हम क्वेरी सिंटैक्स पर कम और अभ्यास पर अधिक ध्यान देंगे। हम 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 में छवियों के साथ काम करने की मूल बातें सिखाना।

Прикрепленные файлы