पीएचपी में कुशल जेपीईजी इमेज का आकार बदलना


82

PHP में बड़ी छवियों को आकार देने का सबसे कुशल तरीका क्या है?

मैं वर्तमान में GD फ़ंक्शन का उपयोग कर रहा हूं उच्च रिज़ॉल्यूशन की छवियां लेने के लिए, और साफ तौर पर उन्हें वेब देखने के लिए एक आकार (लगभग 700 पिक्सेल लंबा चौड़े 700 पिक्सल) के आकार का आकार दें।

यह छोटे (2 एमबी से कम) की तस्वीरों पर बहुत अच्छा काम करता है और सर्वर पर पूरे रिसाइज़ ऑपरेशन में एक सेकंड से भी कम समय लगता है। हालांकि, साइट अंततः फोटोग्राफर्स को सेवा देगी जो 10 एमबी तक के आकार (या 5000x4000 पिक्सल तक के चित्र) में चित्र अपलोड कर सकते हैं।

बड़े चित्रों के साथ इस तरह का आकार परिवर्तन ऑपरेशन करने से बहुत बड़े मार्जिन द्वारा मेमोरी उपयोग में वृद्धि होती है (बड़ी छवियां स्क्रिप्ट के लिए मेमोरी उपयोग को 80 एमबी तक बढ़ा सकती हैं)। क्या इस आकार को ऑपरेशन को अधिक कुशल बनाने का कोई तरीका है? क्या मुझे ImageMagick जैसी वैकल्पिक छवि लाइब्रेरी का उपयोग करना चाहिए ?

अभी, रिसाइज़ कोड कुछ इस तरह दिखता है

function makeThumbnail($sourcefile, $endfile, $thumbwidth, $thumbheight, $quality) {
    // Takes the sourcefile (path/to/image.jpg) and makes a thumbnail from it
    // and places it at endfile (path/to/thumb.jpg).

    // Load image and get image size.
    $img = imagecreatefromjpeg($sourcefile);
    $width = imagesx( $img );
    $height = imagesy( $img );

    if ($width > $height) {
        $newwidth = $thumbwidth;
        $divisor = $width / $thumbwidth;
        $newheight = floor( $height / $divisor);
    } else {
        $newheight = $thumbheight;
        $divisor = $height / $thumbheight;
        $newwidth = floor( $width / $divisor );
    }

    // Create a new temporary image.
    $tmpimg = imagecreatetruecolor( $newwidth, $newheight );

    // Copy and resize old image into new image.
    imagecopyresampled( $tmpimg, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height );

    // Save thumbnail into a file.
    imagejpeg( $tmpimg, $endfile, $quality);

    // release the memory
    imagedestroy($tmpimg);
    imagedestroy($img);

जवाबों:


45

लोगों का कहना है कि ImageMagick ज्यादा तेज है। कम से कम दोनों पुस्तकालयों की तुलना करें और मापें।

  1. 1000 विशिष्ट चित्र तैयार करें।
  2. दो स्क्रिप्ट लिखें - एक जीडी के लिए, एक इमेजमैजिक के लिए।
  3. दोनों को कुछ बार चलाएं।
  4. परिणामों की तुलना करें (कुल निष्पादन समय, सीपीयू और आई / ओ उपयोग, परिणाम छवि गुणवत्ता)।

कुछ ऐसा जो आपके लिए सबसे अच्छा हो, आपके लिए सबसे अच्छा नहीं हो सकता।

इसके अलावा, मेरी राय में, ImageMagick में बेहतर एपीआई इंटरफ़ेस है।


2
उन सर्वरों पर, जिनके साथ मैंने काम किया है, GD अक्सर RAM से बाहर निकलता है और क्रैश हो जाता है, जबकि ImageMagick कभी नहीं करता है।
अभि बेकर्ट

मैं इससे ज्यादा असहमत नहीं हो सकता। मैं काम करने के लिए एक दुःस्वप्न की कल्पना करता हूं। मुझे बड़ी छवियों के लिए अक्सर 500 सर्वर त्रुटियां मिलती हैं। जाहिर है जीडी पुस्तकालय पहले दुर्घटनाग्रस्त हो जाएगा। लेकिन फिर भी, हम केवल कभी-कभी 6Mb छवियों की बात कर रहे हैं, और 500 त्रुटियां सिर्फ सबसे खराब हैं।
सिंगल एंटिटी

20

यहाँ php.net डॉक्स से एक स्निपेट है जिसे मैंने एक प्रोजेक्ट में इस्तेमाल किया है और ठीक काम करता है:

<?
function fastimagecopyresampled (&$dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h, $quality = 3) {
    // Plug-and-Play fastimagecopyresampled function replaces much slower imagecopyresampled.
    // Just include this function and change all "imagecopyresampled" references to "fastimagecopyresampled".
    // Typically from 30 to 60 times faster when reducing high resolution images down to thumbnail size using the default quality setting.
    // Author: Tim Eckel - Date: 09/07/07 - Version: 1.1 - Project: FreeRingers.net - Freely distributable - These comments must remain.
    //
    // Optional "quality" parameter (defaults is 3). Fractional values are allowed, for example 1.5. Must be greater than zero.
    // Between 0 and 1 = Fast, but mosaic results, closer to 0 increases the mosaic effect.
    // 1 = Up to 350 times faster. Poor results, looks very similar to imagecopyresized.
    // 2 = Up to 95 times faster.  Images appear a little sharp, some prefer this over a quality of 3.
    // 3 = Up to 60 times faster.  Will give high quality smooth results very close to imagecopyresampled, just faster.
    // 4 = Up to 25 times faster.  Almost identical to imagecopyresampled for most images.
    // 5 = No speedup. Just uses imagecopyresampled, no advantage over imagecopyresampled.

    if (empty($src_image) || empty($dst_image) || $quality <= 0) { return false; }
    if ($quality < 5 && (($dst_w * $quality) < $src_w || ($dst_h * $quality) < $src_h)) {
        $temp = imagecreatetruecolor ($dst_w * $quality + 1, $dst_h * $quality + 1);
        imagecopyresized ($temp, $src_image, 0, 0, $src_x, $src_y, $dst_w * $quality + 1, $dst_h * $quality + 1, $src_w, $src_h);
        imagecopyresampled ($dst_image, $temp, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h, $dst_w * $quality, $dst_h * $quality);
        imagedestroy ($temp);
    } else imagecopyresampled ($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);
    return true;
}
?>

http://us.php.net/manual/en/function.imagecopyresampled.php#77679


क्या आप जानते हैं कि आप $ dst_x, $ dst_y, $ src_x, $ src_y के लिए क्या कहेंगे?
जेसनडेविस

आप के $quality + 1साथ प्रतिस्थापित नहीं करना चाहिए ($quality + 1)? जैसा कि यह है, आप एक बेकार अतिरिक्त पिक्सेल के साथ आकार बदल रहे हैं। शॉर्ट सर्किट की जाँच कहाँ $dst_w * $quality> कब होती है $src_w?
3

8
सुझाए गए संपादन से कॉपी / पेस्ट किया गया: इस समारोह के लेखक टिम एकेल हैं। $ गुणवत्ता + 1 सही है, इसका उपयोग एक पिक्सेल चौड़ी काली सीमा से बचने के लिए किया जाता है, गुणवत्ता में बदलाव नहीं। इसके अलावा, यह फ़ंक्शन इमेज-कोपाइरेसमैप्ड के साथ प्लग-इन संगत है, इसलिए सिंटैक्स पर प्रश्नों के लिए, इमेजकोपरिसेम्प्ड कमांड देखें, यह समान है।
अन्दोमार

प्रश्न में प्रस्तावित इस समाधान से बेहतर कैसे है? आप अभी भी समान कार्यों के साथ जीडी लाइब्रेरी का उपयोग कर रहे हैं।
टीएमएस

1
@ टोमास, वास्तव में, यह भी उपयोग कर रहा है imagecopyresized()। मूल रूप से, यह छवि को पहले आकार में final dimensionsगुणा ( द्वारा गुणा quality) के आकार का कर रहा है , फिर इसे पूर्ण आकार की छवि को पुनः आकार देने के बजाय, इसे फिर से खोलना है। यह कर सकते हैं एक कम गुणवत्ता अंतिम छवि में परिणाम है, लेकिन यह से बड़ा छवियों के लिए अब तक कम संसाधनों का उपयोग करता imagecopyresampled()अकेले के रूप में resampling एल्गोरिथ्म केवल एक छवि के साथ पूर्ण आकार छवि की तुलना में 3 गुना के आकार डिफ़ॉल्ट रूप से अंतिम आयाम, सौदा करता है ( जो कहीं अधिक बड़ा हो सकता है , विशेष रूप से थंबनेल के लिए आकार बदलने वाले फ़ोटो के लिए)।
0b10011

12

phpThumb जब भी संभव हो गति के लिए ImageMagick का उपयोग करता है (यदि आवश्यक हो तो जीडी पर वापस गिरना) और सर्वर पर लोड को कम करने के लिए बहुत अच्छी तरह से कैश करना प्रतीत होता है। यह बाहर की कोशिश करने के लिए बहुत हल्का है (एक छवि का आकार बदलने के लिए, बस एक GET क्वेरी के साथ phpThumb.php को कॉल करें जिसमें ग्राफिक फ़ाइल नाम और आउटपुट आयाम शामिल हैं), इसलिए आप यह देखने के लिए शॉट दे सकते हैं कि क्या यह आपकी आवश्यकताओं को पूरा करता है।


लेकिन यह हिस्सा नहीं है अगर मानक PHP जैसा लगता है ... तो यह अधिकांश होस्ट पर उपलब्ध नहीं होगा :(
TMS

1
मुझे ऐसा लग रहा है कि यह केवल एक php स्क्रिप्ट है, आपके पास केवल php gd और imagemagick है
Flo

यह वास्तव में एक PHP स्क्रिप्ट है जिसे एक एक्सटेंशन के बजाय आपको स्थापित करना है, इसलिए साझा होस्टिंग वातावरण के लिए अच्छा है। जब मैं jpeg छवियों <1MB 4000x3000 के आयामों के साथ 1MB अपलोड करने की कोशिश कर रहा था, तो "एन बाइट्स की थका हुआ स्मृति आकार" त्रुटि में चल रहा था। PhpThumb का उपयोग कर (और इस तरह ImageMagick) ने इस मुद्दे को हल किया और मेरे कोड में शामिल करना बहुत आसान था।
w5m

10

बड़ी छवियों के लिए ImageMagick में छवि लोड पर आकार देने के लिए libjpeg का उपयोग करें और जिससे मेमोरी का उपयोग काफी कम हो जाता है और प्रदर्शन में सुधार होता है, यह GD के साथ संभव नहीं है।

$im = new Imagick();
try {
  $im->pingImage($file_name);
} catch (ImagickException $e) {
  throw new Exception(_('Invalid or corrupted image file, please try uploading another image.'));
}

$width  = $im->getImageWidth();
$height = $im->getImageHeight();
if ($width > $config['width_threshold'] || $height > $config['height_threshold'])
{
  try {
/* send thumbnail parameters to Imagick so that libjpeg can resize images
 * as they are loaded instead of consuming additional resources to pass back
 * to PHP.
 */
    $fitbyWidth = ($config['width_threshold'] / $width) > ($config['height_threshold'] / $height);
    $aspectRatio = $height / $width;
    if ($fitbyWidth) {
      $im->setSize($config['width_threshold'], abs($width * $aspectRatio));
    } else {
      $im->setSize(abs($height / $aspectRatio), $config['height_threshold']);
    }
    $im->readImage($file_name);

/* Imagick::thumbnailImage(fit = true) has a bug that it does fit both dimensions
 */
//  $im->thumbnailImage($config['width_threshold'], $config['height_threshold'], true);

// workaround:
    if ($fitbyWidth) {
      $im->thumbnailImage($config['width_threshold'], 0, false);
    } else {
      $im->thumbnailImage(0, $config['height_threshold'], false);
    }

    $im->setImageFileName($thumbnail_name);
    $im->writeImage();
  }
  catch (ImagickException $e)
  {
    header('HTTP/1.1 500 Internal Server Error');
    throw new Exception(_('An error occured reszing the image.'));
  }
}

/* cleanup Imagick
 */
$im->destroy();

9

आप से उद्धरण, ऐसा लगता है कि आप जीडी के लिए नए हैं, मैं कुछ अनुभव साझा करूंगा, शायद यह थोड़ा सा विषय है, लेकिन मुझे लगता है कि यह आपके जैसे जीडी के लिए किसी नए के लिए उपयोगी होगा:

चरण 1, फ़ाइल को मान्य करें। $_FILES['image']['tmp_name']फ़ाइल मान्य फ़ाइल है या नहीं यह जाँचने के लिए निम्न फ़ंक्शन का उपयोग करें :

   function getContentsFromImage($image) {
      if (@is_file($image) == true) {
         return file_get_contents($image);
      } else {
         throw new \Exception('Invalid image');
      }
   }
   $contents = getContentsFromImage($_FILES['image']['tmp_name']);

चरण 2, फ़ाइल स्वरूप प्राप्त करें फ़ाइल (सामग्री) के फ़ाइल प्रारूप की जाँच करने के लिए फ़िनिश एक्सटेंशन के साथ निम्न फ़ंक्शन का प्रयास करें। आप कहेंगे कि आप $_FILES["image"]["type"]फाइल फॉर्मेट को जांचने के लिए क्यों नहीं करते ? क्योंकि यह केवल जांच फाइल एक्सटेंशन सामग्री फाइल नहीं, अगर कोई मूल रूप से कहा जाता है फ़ाइल का नाम बदलने world.png को world.jpg , $_FILES["image"]["type"]jpeg वापस आ जाएगी png नहीं है, तो $_FILES["image"]["type"]गलत परिणाम वापस आ सकते हैं।

   function getFormatFromContents($contents) {
      $finfo = new \finfo();
      $mimetype = $finfo->buffer($contents, FILEINFO_MIME_TYPE);
      switch ($mimetype) {
         case 'image/jpeg':
            return 'jpeg';
            break;
         case 'image/png':
            return 'png';
            break;
         case 'image/gif':
            return 'gif';
            break;
         default:
            throw new \Exception('Unknown or unsupported image format');
      }
   }
   $format = getFormatFromContents($contents);

चरण 3, GD संसाधन प्राप्त करें GD संसाधन हमारे पास पहले से मौजूद सामग्री से प्राप्त करें:

   function getGDResourceFromContents($contents) {
      $resource = @imagecreatefromstring($contents);
      if ($resource == false) {
         throw new \Exception('Cannot process image');
      }
      return $resource;
   }
   $resource = getGDResourceFromContents($contents);

चरण 4, छवि आयाम प्राप्त करें अब आप निम्न सरल कोड के साथ छवि आयाम प्राप्त कर सकते हैं:

  $width = imagesx($resource);
  $height = imagesy($resource);

अब, देखते हैं कि मूल छवि से हमें कौन सा चर मिला:

       $contents, $format, $resource, $width, $height
       OK, lets move on

चरण 5, आकृति परिवर्तन के तर्कों की गणना करें। यह कदम आपके प्रश्न से संबंधित है, निम्न कार्य का उद्देश्य जीडी फ़ंक्शन के लिए पुनरीक्षण तर्क प्राप्त करना है।imagecopyresampled() , कोड थोड़े लंबा है, लेकिन यह बहुत अच्छा काम करता है, इसमें तीन विकल्प भी हैं: खिंचाव, हटना , और भरें।

खिंचाव : आउटपुट इमेज का आयाम आपके द्वारा निर्धारित नए आयाम के समान है। ऊंचाई / चौड़ाई अनुपात नहीं रखेंगे।

हटना : आउटपुट छवि का आयाम आपके द्वारा दिए गए नए आयाम से अधिक नहीं होगा, और छवि की ऊँचाई / चौड़ाई अनुपात बनाए रखेगा।

भरण : आउटपुट छवि का आयाम आपके द्वारा दिए गए नए आयाम के समान होगा, यहजरूरत पड़ने पर फसल को आकार और आकार देगा, और छवि की ऊंचाई / चौड़ाई अनुपात को बनाए रखेगा। यह विकल्प वही है जो आपको अपने प्रश्न में चाहिए।

   function getResizeArgs($width, $height, $newwidth, $newheight, $option) {
      if ($option === 'stretch') {
         if ($width === $newwidth && $height === $newheight) {
            return false;
         }
         $dst_w = $newwidth;
         $dst_h = $newheight;
         $src_w = $width;
         $src_h = $height;
         $src_x = 0;
         $src_y = 0;
      } else if ($option === 'shrink') {
         if ($width <= $newwidth && $height <= $newheight) {
            return false;
         } else if ($width / $height >= $newwidth / $newheight) {
            $dst_w = $newwidth;
            $dst_h = (int) round(($newwidth * $height) / $width);
         } else {
            $dst_w = (int) round(($newheight * $width) / $height);
            $dst_h = $newheight;
         }
         $src_x = 0;
         $src_y = 0;
         $src_w = $width;
         $src_h = $height;
      } else if ($option === 'fill') {
         if ($width === $newwidth && $height === $newheight) {
            return false;
         }
         if ($width / $height >= $newwidth / $newheight) {
            $src_w = (int) round(($newwidth * $height) / $newheight);
            $src_h = $height;
            $src_x = (int) round(($width - $src_w) / 2);
            $src_y = 0;
         } else {
            $src_w = $width;
            $src_h = (int) round(($width * $newheight) / $newwidth);
            $src_x = 0;
            $src_y = (int) round(($height - $src_h) / 2);
         }
         $dst_w = $newwidth;
         $dst_h = $newheight;
      }
      if ($src_w < 1 || $src_h < 1) {
         throw new \Exception('Image width or height is too small');
      }
      return array(
          'dst_x' => 0,
          'dst_y' => 0,
          'src_x' => $src_x,
          'src_y' => $src_y,
          'dst_w' => $dst_w,
          'dst_h' => $dst_h,
          'src_w' => $src_w,
          'src_h' => $src_h
      );
   }
   $args = getResizeArgs($width, $height, 150, 170, 'fill');

चरण 6, आकार छवि का उपयोग करें $args, $width, $height, $formatऔर $ संसाधन हम निम्नलिखित समारोह में ऊपर से मिला परिवर्तित और छवि के नए संसाधन मिलता है:

   function runResize($width, $height, $format, $resource, $args) {
      if ($args === false) {
         return; //if $args equal to false, this means no resize occurs;
      }
      $newimage = imagecreatetruecolor($args['dst_w'], $args['dst_h']);
      if ($format === 'png') {
         imagealphablending($newimage, false);
         imagesavealpha($newimage, true);
         $transparentindex = imagecolorallocatealpha($newimage, 255, 255, 255, 127);
         imagefill($newimage, 0, 0, $transparentindex);
      } else if ($format === 'gif') {
         $transparentindex = imagecolorallocatealpha($newimage, 255, 255, 255, 127);
         imagefill($newimage, 0, 0, $transparentindex);
         imagecolortransparent($newimage, $transparentindex);
      }
      imagecopyresampled($newimage, $resource, $args['dst_x'], $args['dst_y'], $args['src_x'], $args['src_y'], $args['dst_w'], $args['dst_h'], $args['src_w'], $args['src_h']);
      imagedestroy($resource);
      return $newimage;
   }
   $newresource = runResize($width, $height, $format, $resource, $args);

चरण 7, नई सामग्री प्राप्त करें, नए GD संसाधन से सामग्री प्राप्त करने के लिए निम्न फ़ंक्शन का उपयोग करें:

   function getContentsFromGDResource($resource, $format) {
      ob_start();
      switch ($format) {
         case 'gif':
            imagegif($resource);
            break;
         case 'jpeg':
            imagejpeg($resource, NULL, 100);
            break;
         case 'png':
            imagepng($resource, NULL, 9);
      }
      $contents = ob_get_contents();
      ob_end_clean();
      return $contents;
   }
   $newcontents = getContentsFromGDResource($newresource, $format);

चरण 8 को विस्तार मिलता है , छवि प्रारूप से विस्तार पाने के लिए निम्नलिखित फ़ंक्शन का उपयोग करें (ध्यान दें, छवि प्रारूप छवि विस्तार के बराबर नहीं है):

   function getExtensionFromFormat($format) {
      switch ($format) {
         case 'gif':
            return 'gif';
            break;
         case 'jpeg':
            return 'jpg';
            break;
         case 'png':
            return 'png';
      }
   }
   $extension = getExtensionFromFormat($format);

चरण 9 सहेजें छवि अगर हमारे पास माइक नाम का कोई उपयोगकर्ता है, तो आप निम्न कार्य कर सकते हैं, यह उसी फ़ोल्डर में बचाएगा, जो इस php स्क्रिप्ट के रूप में है:

$user_name = 'mike';
$filename = $user_name . '.' . $extension;
file_put_contents($filename, $newcontents);

चरण 10 नष्ट संसाधन जीडी संसाधन को नष्ट मत भूलना!

imagedestroy($newresource);

या आप अपने सभी कोड को एक वर्ग में लिख सकते हैं, और बस निम्नलिखित का उपयोग कर सकते हैं:

   public function __destruct() {
      @imagedestroy($this->resource);
   }

टिप्स

मैं अनुशंसा करता हूं कि उपयोगकर्ता द्वारा अपलोड किए जाने वाले फ़ाइल प्रारूप को परिवर्तित न करें, आप कई समस्याओं को पूरा करेंगे।


4

मेरा सुझाव है कि आप इन पंक्तियों के साथ कुछ काम करें:

  1. छवि प्रकार और आकार की जांच करने के लिए अपलोड की गई फ़ाइल पर एक getimagesize () करें
  2. किसी भी अपलोड की गई JPEG छवि को "फ़ोल्डर के अनुसार" गंतव्य फ़ोल्डर में 700x700px से कम सहेजें
  3. मध्यम आकार की छवियों के लिए GD लाइब्रेरी का उपयोग करें (कोड नमूने के लिए यह लेख देखें: PHP और GD लाइब्रेरी का उपयोग करके छवियों का आकार बदलें )
  4. बड़ी छवियों के लिए ImageMagick का उपयोग करें। आप चाहें तो ImageMagick को पृष्ठभूमि में उपयोग कर सकते हैं।

बैकग्राउंड में ImageMagick का उपयोग करने के लिए, अपलोड की गई फ़ाइलों को एक अस्थायी फ़ोल्डर में ले जाएं और एक CRON जॉब शेड्यूल करें जो सभी फाइलों को जेपीईजी में बदल दे और उनके अनुसार आकार बदल दे। कमांड सिंटैक्स यहाँ देखें: इमेजमैगिक-कमांड लाइन प्रोसेसिंग

आप उस उपयोगकर्ता को संकेत कर सकते हैं जो फ़ाइल अपलोड की गई है और संसाधित होने वाली है। CRON जॉब को एक विशिष्ट अंतराल पर दैनिक चलाने के लिए निर्धारित किया जा सकता है। स्रोत छवि को संसाधित करने के बाद हटाया जा सकता है यह आश्वासन देने के लिए कि छवि दो बार संसाधित नहीं हुई है।


मुझे बिंदु 3 के लिए कोई कारण नहीं दिखता है - मध्यम आकार के लिए GD का उपयोग करें। क्यों नहीं उनके लिए भी ImageMagick का उपयोग करें? यह कोड को बहुत सरल करेगा।
टीएमएस

क्रोन की तुलना में बहुत बेहतर एक स्क्रिप्ट होगी जो इनोटिफ़ाइवाइट का उपयोग करती है ताकि क्रॉज़ की नौकरी शुरू होने का इंतजार करने के बजाय आकार तुरंत शुरू हो जाए।
कॉलिनम

3

मैंने इमेजिक लाइब्रेरी के बारे में बड़ी बातें सुनी हैं, दुर्भाग्य से मैं इसे अपने काम के कंप्यूटर पर स्थापित नहीं कर सका और न ही घर पर (और मुझ पर भरोसा है, मैंने सभी प्रकार के मंचों पर घंटे और घंटे बिताए)।

Afterwords, मैंने इस PHP वर्ग को आज़माने का फैसला किया है:

http://www.verot.net/php_class_upload.htm

यह बहुत अच्छा है और मैं सभी प्रकार की छवियों का आकार बदल सकता हूं (मैं उन्हें जेपीजी में भी बदल सकता हूं)।


3

ImageMagick को मल्टीथ्रेड किया गया है, इसलिए यह तेज़ प्रतीत होता है, लेकिन वास्तव में GD की तुलना में बहुत अधिक संसाधनों का उपयोग करता है। यदि आप GD का उपयोग करके समानांतर में कई PHP स्क्रिप्ट चलाते हैं तो वे ImageMagick को सरल ऑपरेशन के लिए गति में हरा देंगे। ExactImage ImageMagick की तुलना में कम शक्तिशाली है, लेकिन बहुत तेज़ है, हालांकि PHP के माध्यम से उपलब्ध नहीं है, आपको इसे सर्वर पर स्थापित करना होगा और इसके माध्यम से चलाना होगा exec


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.