كيف يمكنني تغيير حجم الصورة التي تم تحميلها وتحويلها إلى PNG باستخدام GD؟

StackOverflow https://stackoverflow.com/questions/22259

  •  09-06-2019
  •  | 
  •  

سؤال

أريد السماح للمستخدمين بتحميل الصور الرمزية بتنسيقات متنوعة (GIF وJPEG وPNG على الأقل)، ولكن لحفظها جميعًا باسم PNG قاعدة بيانات BLOBs.إذا كانت الصور كبيرة الحجم، من حيث حجم البكسل، فأنا أرغب في تغيير حجمها قبل إدراج قاعدة البيانات.

ما هي أفضل طريقة لاستخدام GD لإجراء تغيير الحجم وتحويل PNG؟

يحرر:للأسف فقط جي دي متاح على الخادم الذي أحتاج إلى استخدامه، لا ImageMagick.

هل كانت مفيدة؟

المحلول

<?php                                              
/*
Resizes an image and converts it to PNG returning the PNG data as a string
*/
function imageToPng($srcFile, $maxSize = 100) {  
    list($width_orig, $height_orig, $type) = getimagesize($srcFile);        

    // Get the aspect ratio
    $ratio_orig = $width_orig / $height_orig;

    $width  = $maxSize; 
    $height = $maxSize;

    // resize to height (orig is portrait) 
    if ($ratio_orig < 1) {
        $width = $height * $ratio_orig;
    } 
    // resize to width (orig is landscape)
    else {
        $height = $width / $ratio_orig;
    }

    // Temporarily increase the memory limit to allow for larger images
    ini_set('memory_limit', '32M'); 

    switch ($type) 
    {
        case IMAGETYPE_GIF: 
            $image = imagecreatefromgif($srcFile); 
            break;   
        case IMAGETYPE_JPEG:  
            $image = imagecreatefromjpeg($srcFile); 
            break;   
        case IMAGETYPE_PNG:  
            $image = imagecreatefrompng($srcFile);
            break; 
        default:
            throw new Exception('Unrecognized image type ' . $type);
    }

    // create a new blank image
    $newImage = imagecreatetruecolor($width, $height);

    // Copy the old image to the new image
    imagecopyresampled($newImage, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);

    // Output to a temp file
    $destFile = tempnam();
    imagepng($newImage, $destFile);  

    // Free memory                           
    imagedestroy($newImage);

    if ( is_file($destFile) ) {
        $f = fopen($destFile, 'rb');   
        $data = fread($f);       
        fclose($f);

        // Remove the tempfile
        unlink($destFile);    
        return $data;
    }

    throw new Exception('Image conversion failed.');
}

نصائح أخرى

يجب أن تبدو خطوات العملية الخاصة بك كما يلي:

  1. يؤكد ال نوع الملف
  2. قم بتحميل الصورة إذا كانت من نوع ملف مدعوم إلى GD باستخدام إنشاء صورة من*
  3. تغيير الحجم باستخدام imagecopyresize أو imagecopyresampled
  4. احفظ الصورة باستخدام imagepng(مقبض $، 'filename.png'، $quality، $filters)

يعد ImageMagick أسرع، وينشئ صورًا أفضل، وأكثر قابلية للتكوين، وأخيرًا (IMO) أسهل بكثير في البرمجة.

@ceejayoz فقط انتظر GD الجديد - إنه OOP مثل MySQLi وهو في الواقع ليس سيئًا :)

إذا كنت تريد استخدام gdlib، فاستخدم gdlib 2 أو أعلى.يحتوي على وظيفة تسمى imagecopyresampled()، والتي ستقوم بتحريف وحدات البكسل أثناء تغيير الحجم وتبدو أفضل بكثير.

أيضًا، لقد سمعت دائمًا ملاحظة حول الشبكة أن تخزين الصور في قاعدة البيانات يعد أمرًا سيئًا:

  • الوصول إليه أبطأ من القرص
  • سيحتاج الخادم الخاص بك إلى تشغيل برنامج نصي للوصول إلى الصورة بدلاً من مجرد تقديم ملف
  • البرنامج النصي الخاص بك الآن مسؤول عن الكثير من الأشياء التي يستخدمها خادم الويب للتعامل معها:
    • تعيين رأس نوع المحتوى المناسب
    • تعيين رؤوس التخزين المؤقت/المهلة/العلامة الإلكترونية المناسبة، حتى يتمكن العملاء من تخزين الصورة مؤقتًا بشكل صحيح.إذا لم تقم بذلك بشكل صحيح، فسيتم الضغط على البرنامج النصي لعرض الصور في كل طلب، مما يزيد الحمل على الخادم بشكل أكبر.

الميزة الوحيدة التي يمكنني رؤيتها هي أنك لست بحاجة إلى الحفاظ على مزامنة قاعدة البيانات وملفات الصور الخاصة بك.ما زلت أوصي ضده بالرغم من ذلك.

هل أنت متأكد من عدم وجود ImageMagick على الخادم؟

أقترح عليك استخدام PHP (تم وضع علامة على السؤال باستخدام PHP).الشركة المستضيفة التي أستخدمها لا تحتوي على امتداد ImageMagick قيد التشغيل وفقًا لـ phpinfo().

لكن عندما سألتهم عن ذلك قالوا فيما يلي قائمة ببرامج ImageMagick المتوفرة من كود PHP.ببساطة - لا توجد واجهة مراسلة فورية في PHP، لكن يمكنني الاتصال ببرامج المراسلة الفورية مباشرة من PHP.

أتمنى أن يكون لديك نفس الخيار.

و انا بقوة أوافق - تخزين الصور في قاعدة البيانات ليس فكرة جيدة.

ربما شيء من هذا القبيل:


<?php
   //Input file
   $file = "myImage.png";
   $img = ImageCreateFromPNG($file);

   //Dimensions
   $width = imagesx($img);
   $height = imagesy($img);
   $max_width = 300;
   $max_height = 300;
   $percentage = 1;

   //Image scaling calculations
   if ( $width > $max_width ) { 
      $percentage = ($height / ($width / $max_width)) > $max_height ?
           $height / $max_height :
           $width / $max_width;
   }
   elseif ( $height > $max_height) {
      $percentage = ($width / ($height / $max_height)) > $max_width ? 
           $width / $max_width :
           $height / $max_height;
   }
   $new_width = $width / $percentage;
   $new_height = $height / $percentage;

   //scaled image
   $out = imagecreatetruecolor($new_width, $new_height);
   imagecopyresampled($out, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

   //output image
   imagepng($out);
?>

لم أختبر الكود لذا قد يكون هناك بعض الأخطاء النحوية، ومع ذلك يجب أن يقدم لك عرضًا تقديميًا عادلاً حول كيفية القيام بذلك.كما افترضت ملف PNG.قد ترغب في الحصول على نوع من بيان التبديل لتحديد نوع الملف.

هذا المقال يبدو أنه يناسب ما تريد.ستحتاج إلى تغيير وظيفة حفظ imagejpeg() إلى imagepng() وجعلها تحفظ الملف في سلسلة بدلاً من إخراجه إلى الصفحة، ولكن بخلاف ذلك يجب أن يكون من السهل نسخ/لصق في التعليمات البرمجية الموجودة لديك.

هل GD مطلوب بالتأكيد؟ ImageMagick أسرع، ويولد صورًا أفضل، وأكثر قابلية للتكوين، وأخيرًا (IMO) أسهل بكثير في البرمجة.

أظن هذه الصفحة هي نقطة انطلاق جيدة.يستخدم imagecreatefrom(jpeg/gif/png) ويقوم بتغيير حجم الصورة وتحويلها ثم إخراجها إلى المتصفح.بدلاً من إخراج المتصفح، يمكنك الإخراج إلى BLOB في قاعدة بيانات دون الحاجة إلى إعادة كتابة التعليمات البرمجية لعدة دقائق.

phpThumb هو تجريد عالي المستوى قد يستحق النظر إليه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top