ปรับขนาดภาพใน PHP


96

ฉันต้องการเขียนโค้ด PHP ซึ่งจะปรับขนาดรูปภาพที่อัปโหลดโดยอัตโนมัติผ่านแบบฟอร์มเป็น 147x147px แต่ฉันไม่รู้ว่าจะทำอย่างไร (ฉันเป็นมือใหม่ PHP แบบสัมพัทธ์)

จนถึงตอนนี้ฉันอัปโหลดรูปภาพได้สำเร็จประเภทไฟล์ได้รับการยอมรับและล้างชื่อแล้ว แต่ฉันต้องการเพิ่มฟังก์ชันการปรับขนาดลงในโค้ด ตัวอย่างเช่นฉันมีภาพทดสอบขนาด 2.3MB และ 1331x1331 และฉันต้องการให้โค้ดลดขนาดลงซึ่งฉันเดาว่าจะบีบอัดขนาดไฟล์ของรูปภาพอย่างมากด้วย

จนถึงตอนนี้ฉันมีสิ่งต่อไปนี้:

if ($_FILES) {
                //Put file properties into variables
                $file_name = $_FILES['profile-image']['name'];
                $file_size = $_FILES['profile-image']['size'];
                $file_tmp_name = $_FILES['profile-image']['tmp_name'];

                //Determine filetype
                switch ($_FILES['profile-image']['type']) {
                    case 'image/jpeg': $ext = "jpg"; break;
                    case 'image/png': $ext = "png"; break;
                    default: $ext = ''; break;
                }

                if ($ext) {
                    //Check filesize
                    if ($file_size < 500000) {
                        //Process file - clean up filename and move to safe location
                        $n = "$file_name";
                        $n = ereg_replace("[^A-Za-z0-9.]", "", $n);
                        $n = strtolower($n);
                        $n = "avatars/$n";
                        move_uploaded_file($file_tmp_name, $n);
                    } else {
                        $bad_message = "Please ensure your chosen file is less than 5MB.";
                    }
                } else {
                    $bad_message = "Please ensure your image is of filetype .jpg or.png.";
                }
            }
$query = "INSERT INTO users (image) VALUES ('$n')";
mysql_query($query) or die("Insert failed. " . mysql_error() . "<br />" . $query);

คุณลองตัวอย่างเช่นstackoverflow.com/questions/10029838/image-resize-with-phpเหล่านี้หรือไม่
Coenie Richards

โดยไม่ต้องเปลี่ยนupload_max_filesizeในphp.iniตอนแรกมันเป็นไปได้ที่จะอัปโหลดไฟล์ที่มีขนาดมากกว่าupload_max_filesize? มีโอกาสที่จะปรับขนาดภาพที่มีขนาดมากกว่าupload_max_filesizeหรือไม่? โดยไม่มีการเปลี่ยนแปลงupload_max_filesizeในphp.ini
rch

คำตอบ:


143

คุณต้องใช้ฟังก์ชันImageMagickหรือGDของ PHP เพื่อทำงานกับรูปภาพ

ตัวอย่างเช่น GD มันง่ายเหมือน ...

function resize_image($file, $w, $h, $crop=FALSE) {
    list($width, $height) = getimagesize($file);
    $r = $width / $height;
    if ($crop) {
        if ($width > $height) {
            $width = ceil($width-($width*abs($r-$w/$h)));
        } else {
            $height = ceil($height-($height*abs($r-$w/$h)));
        }
        $newwidth = $w;
        $newheight = $h;
    } else {
        if ($w/$h > $r) {
            $newwidth = $h*$r;
            $newheight = $h;
        } else {
            $newheight = $w/$r;
            $newwidth = $w;
        }
    }
    $src = imagecreatefromjpeg($file);
    $dst = imagecreatetruecolor($newwidth, $newheight);
    imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

    return $dst;
}

และคุณสามารถเรียกใช้ฟังก์ชันนี้ได้เช่นนั้น ...

$img = resize_image(‘/path/to/some/image.jpg’, 200, 200);

จากประสบการณ์ส่วนตัวการสุ่มตัวอย่างรูปภาพของ GD จะช่วยลดขนาดไฟล์ลงอย่างมากเช่นกันโดยเฉพาะอย่างยิ่งเมื่อทำการสุ่มตัวอย่างภาพจากกล้องดิจิทัลแบบดิบ


1
คุณจัดเก็บภาพเป็นBLOBs หรือไม่? ฉันอยากจะแนะนำให้จัดเก็บภาพในระบบไฟล์และแทรกข้อมูลอ้างอิงในฐานข้อมูลของคุณ ฉันขอแนะนำให้อ่านเอกสาร GD (หรือ ImageMagick) ฉบับเต็มเพื่อดูว่าคุณมีตัวเลือกอะไรอีกบ้าง
Ian Atkin

20
หมายเหตุโซลูชันนี้ใช้ได้กับ JPEG เท่านั้น คุณสามารถแทนที่ imagecreatefromjpeg ด้วยสิ่งต่อไปนี้: imagecreatefromgd, imagecreatefromgif, imagecreatefrompng, imagecreatefromstring, imagecreatefromwbmp, imagecreatefromxbm, imagecreatefromxpm เพื่อจัดการกับรูปภาพประเภทต่างๆ
Chris Hanson

2
@GordonFreeman ขอบคุณสำหรับข้อมูลโค้ดที่ดี แต่มีข้อผิดพลาดอย่างหนึ่งที่นั่นเพิ่มabs()ชอบceil($width-($width*abs($r-$w/$h)))และเหมือนกันกับส่วนความสูง จำเป็นสำหรับบางกรณี
Arman P.

1
การเปลี่ยนค่าการครอบตัดเริ่มต้นเป็นจริงและปรับขนาดรูปภาพhttp://wallpapercave.com/wp/wc1701171.jpgเป็น 400x128 (แบนเนอร์) สร้างภาพสีดำ ฉันคิดไม่ออกว่าทำไมถึงทำแบบนั้น
FoxInFlame

5
หากต้องการบันทึกรูปภาพที่ปรับขนาดแล้วในระบบไฟล์ให้เพิ่มimagejpeg($dst, $file);หลังimagecopyresampled($dst,...บรรทัด เปลี่ยน$fileถ้าคุณไม่ต้องการเขียนทับต้นฉบับ
wkille

23

ทรัพยากรนี้ (ลิงก์เสีย) ก็ควรพิจารณาเช่นกันรหัสที่เป็นระเบียบเรียบร้อยมากที่ใช้ GD อย่างไรก็ตามฉันได้แก้ไขข้อมูลโค้ดขั้นสุดท้ายเพื่อสร้างฟังก์ชันนี้ซึ่งตรงตามข้อกำหนดของ OPs ...

function store_uploaded_image($html_element_name, $new_img_width, $new_img_height) {
    
    $target_dir = "your-uploaded-images-folder/";
    $target_file = $target_dir . basename($_FILES[$html_element_name]["name"]);
    
    $image = new SimpleImage();
    $image->load($_FILES[$html_element_name]['tmp_name']);
    $image->resize($new_img_width, $new_img_height);
    $image->save($target_file);
    return $target_file; //return name of saved file in case you want to store it in you database or show confirmation message to user
    
}

คุณจะต้องรวมไฟล์ PHP นี้ด้วย ...

<?php
 
/*
* File: SimpleImage.php
* Author: Simon Jarvis
* Copyright: 2006 Simon Jarvis
* Date: 08/11/06
* Link: http://www.white-hat-web-design.co.uk/blog/resizing-images-with-php/
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details:
* http://www.gnu.org/licenses/gpl.html
*
*/
 
class SimpleImage {
 
   var $image;
   var $image_type;
 
   function load($filename) {
 
      $image_info = getimagesize($filename);
      $this->image_type = $image_info[2];
      if( $this->image_type == IMAGETYPE_JPEG ) {
 
         $this->image = imagecreatefromjpeg($filename);
      } elseif( $this->image_type == IMAGETYPE_GIF ) {
 
         $this->image = imagecreatefromgif($filename);
      } elseif( $this->image_type == IMAGETYPE_PNG ) {
 
         $this->image = imagecreatefrompng($filename);
      }
   }
   function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {
 
      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image,$filename,$compression);
      } elseif( $image_type == IMAGETYPE_GIF ) {
 
         imagegif($this->image,$filename);
      } elseif( $image_type == IMAGETYPE_PNG ) {
 
         imagepng($this->image,$filename);
      }
      if( $permissions != null) {
 
         chmod($filename,$permissions);
      }
   }
   function output($image_type=IMAGETYPE_JPEG) {
 
      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image);
      } elseif( $image_type == IMAGETYPE_GIF ) {
 
         imagegif($this->image);
      } elseif( $image_type == IMAGETYPE_PNG ) {
 
         imagepng($this->image);
      }
   }
   function getWidth() {
 
      return imagesx($this->image);
   }
   function getHeight() {
 
      return imagesy($this->image);
   }
   function resizeToHeight($height) {
 
      $ratio = $height / $this->getHeight();
      $width = $this->getWidth() * $ratio;
      $this->resize($width,$height);
   }
 
   function resizeToWidth($width) {
      $ratio = $width / $this->getWidth();
      $height = $this->getheight() * $ratio;
      $this->resize($width,$height);
   }
 
   function scale($scale) {
      $width = $this->getWidth() * $scale/100;
      $height = $this->getheight() * $scale/100;
      $this->resize($width,$height);
   }
 
   function resize($width,$height) {
      $new_image = imagecreatetruecolor($width, $height);
      imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
      $this->image = $new_image;
   }      
 
}
?>

1
ตัวอย่างของคุณดีที่สุด มันทำงานใน Zend framework โดยตรงโดยไม่ต้องสร้างความขบขันดราม่าดึงผม ยกนิ้วให้

ผมคิดว่าทุกรหัสที่คุณจำเป็นต้องควรจะอยู่ในคำตอบของฉัน แต่นี้ยังอาจช่วยgist.github.com/arrowmedia/7863973
ban-geoengineering

20

ฟังก์ชั่นการใช้งานที่ง่าย PHP ( imagescale ):

ไวยากรณ์:

imagescale ( $image , $new_width , $new_height )

ตัวอย่าง:

ขั้นตอน: 1 อ่านไฟล์

$image_name =  'path_of_Image/Name_of_Image.jpg|png';      

ขั้นตอน: 2: โหลดไฟล์รูปภาพ

 $image = imagecreatefromjpeg($image_name); // For JPEG
//or
 $image = imagecreatefrompng($image_name);   // For PNG

ขั้นตอนที่: 3: เครื่องช่วยชีวิตของเรามาใน '_' | ปรับขนาดภาพ

   $imgResized = imagescale($image , 500, 400); // width=500 and height = 400
//  $imgResized is our final product

หมายเหตุ: imagescale จะใช้ได้กับ (PHP 5> = 5.5.0, PHP 7)

ที่มา: คลิกเพื่ออ่านเพิ่มเติม


ทางออกที่ดีที่สุดสำหรับ PHP 5.6.3>
Pattycake Jr

12

หากคุณไม่สนใจเกี่ยวกับสัดส่วนภาพ (เช่นคุณต้องการบังคับให้ภาพมีขนาดใดมิติหนึ่ง) นี่คือคำตอบที่เข้าใจง่าย

// for jpg 
function resize_imagejpg($file, $w, $h) {
   list($width, $height) = getimagesize($file);
   $src = imagecreatefromjpeg($file);
   $dst = imagecreatetruecolor($w, $h);
   imagecopyresampled($dst, $src, 0, 0, 0, 0, $w, $h, $width, $height);
   return $dst;
}

 // for png
function resize_imagepng($file, $w, $h) {
   list($width, $height) = getimagesize($file);
   $src = imagecreatefrompng($file);
   $dst = imagecreatetruecolor($w, $h);
   imagecopyresampled($dst, $src, 0, 0, 0, 0, $w, $h, $width, $height);
   return $dst;
}

// for gif
function resize_imagegif($file, $w, $h) {
   list($width, $height) = getimagesize($file);
   $src = imagecreatefromgif($file);
   $dst = imagecreatetruecolor($w, $h);
   imagecopyresampled($dst, $src, 0, 0, 0, 0, $w, $h, $width, $height);
   return $dst;
}

ตอนนี้เรามาจัดการส่วนการอัปโหลดกัน ขั้นตอนแรกอัปโหลดไฟล์ไปยังไดเร็กทอรีที่คุณต้องการ จากนั้นเรียกหนึ่งในฟังก์ชันข้างต้นตามประเภทไฟล์ (jpg, png หรือ gif) และส่งผ่านเส้นทางที่แน่นอนของไฟล์ที่อัปโหลดของคุณดังต่อไปนี้:

 // jpg  change the dimension 750, 450 to your desired values
 $img = resize_imagejpg('path/image.jpg', 750, 450);

ค่าที่ส่งคืน$imgเป็นวัตถุทรัพยากร เราสามารถบันทึกไปยังตำแหน่งใหม่หรือแทนที่เดิมได้ดังนี้:

 // again for jpg
 imagejpeg($img, 'path/newimage.jpg');

หวังว่านี่จะช่วยใครบางคนได้ ตรวจสอบลิงก์เหล่านี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการปรับขนาด Imagick :: resizeImageและ imagejpeg ()


โดยไม่ต้องเปลี่ยนupload_max_filesizeในตอนแรกคุณไม่สามารถอัปโหลดไฟล์ที่มีขนาดมากกว่าphp.ini upload_max_filesizeมีโอกาสที่จะปรับขนาดภาพที่มีขนาดมากกว่าupload_max_filesizeโดยไม่ต้องเปลี่ยนupload_max_filesizeในphp.ini
rch

6

ฉันหวังว่าจะทำงานให้คุณ

/**
         * Image re-size
         * @param int $width
         * @param int $height
         */
        function ImageResize($width, $height, $img_name)
        {
                /* Get original file size */
                list($w, $h) = getimagesize($_FILES['logo_image']['tmp_name']);


                /*$ratio = $w / $h;
                $size = $width;

                $width = $height = min($size, max($w, $h));

                if ($ratio < 1) {
                    $width = $height * $ratio;
                } else {
                    $height = $width / $ratio;
                }*/

                /* Calculate new image size */
                $ratio = max($width/$w, $height/$h);
                $h = ceil($height / $ratio);
                $x = ($w - $width / $ratio) / 2;
                $w = ceil($width / $ratio);
                /* set new file name */
                $path = $img_name;


                /* Save image */
                if($_FILES['logo_image']['type']=='image/jpeg')
                {
                    /* Get binary data from image */
                    $imgString = file_get_contents($_FILES['logo_image']['tmp_name']);
                    /* create image from string */
                    $image = imagecreatefromstring($imgString);
                    $tmp = imagecreatetruecolor($width, $height);
                    imagecopyresampled($tmp, $image, 0, 0, $x, 0, $width, $height, $w, $h);
                    imagejpeg($tmp, $path, 100);
                }
                else if($_FILES['logo_image']['type']=='image/png')
                {
                    $image = imagecreatefrompng($_FILES['logo_image']['tmp_name']);
                    $tmp = imagecreatetruecolor($width,$height);
                    imagealphablending($tmp, false);
                    imagesavealpha($tmp, true);
                    imagecopyresampled($tmp, $image,0,0,$x,0,$width,$height,$w, $h);
                    imagepng($tmp, $path, 0);
                }
                else if($_FILES['logo_image']['type']=='image/gif')
                {
                    $image = imagecreatefromgif($_FILES['logo_image']['tmp_name']);

                    $tmp = imagecreatetruecolor($width,$height);
                    $transparent = imagecolorallocatealpha($tmp, 0, 0, 0, 127);
                    imagefill($tmp, 0, 0, $transparent);
                    imagealphablending($tmp, true); 

                    imagecopyresampled($tmp, $image,0,0,0,0,$width,$height,$w, $h);
                    imagegif($tmp, $path);
                }
                else
                {
                    return false;
                }

                return true;
                imagedestroy($image);
                imagedestroy($tmp);
        }

6

ฉันสร้างไลบรารีที่ใช้งานง่ายสำหรับการปรับขนาดภาพ มันสามารถพบได้ที่นี่ใน Github

ตัวอย่างวิธีการใช้ห้องสมุด:

// Include PHP Image Magician library
require_once('php_image_magician.php');

// Open JPG image
$magicianObj = new imageLib('racecar.jpg');

// Resize to best fit then crop (check out the other options)
$magicianObj -> resizeImage(100, 200, 'crop');

// Save resized image as a PNG (or jpg, bmp, etc)
$magicianObj -> saveImage('racecar_small.png');

คุณสมบัติอื่น ๆ ที่คุณต้องการ ได้แก่ :

  • ปรับขนาดได้ง่ายและรวดเร็ว - ปรับขนาดเป็นแนวนอนแนวตั้งหรืออัตโนมัติ
  • ครอบตัดง่าย
  • เพิ่มข้อความ
  • การปรับคุณภาพ
  • ลายน้ำ
  • เงาและแสงสะท้อน
  • การสนับสนุนความโปร่งใส
  • อ่านข้อมูลเมตาของ EXIF
  • เส้นขอบมุมโค้งมนการหมุน
  • ฟิลเตอร์และเอฟเฟกต์
  • ความคมชัดของภาพ
  • การแปลงประเภทรูปภาพ
  • รองรับ BMP

1
วันนี้ช่วยฉันไว้ อย่างไรก็ตามมีการแจ้งให้ทราบเล็กน้อยสำหรับคนที่ค้นหามา 3 วันเหมือนฉันและกำลังจะหมดความหวังในการค้นหาโซลูชันการปรับขนาดใด ๆ หากคุณเห็นการแจ้งดัชนีที่ไม่ได้กำหนดในอนาคตให้ดูที่ลิงค์นี้: github.com/Oberto/php-image-magician/pull/16/commitsและใช้การเปลี่ยนแปลงกับไฟล์ มันจะทำงานได้ 100% โดยไม่มีปัญหาใด ๆ
Hema_Elmasry

2
เฮ้ @Hema_Elmasry FYI ฉันเพิ่งรวมการเปลี่ยนแปลงเหล่านั้นเข้ากับหลัก :)
Jarrod

โอเคขอโทษฉันไม่ได้สังเกต แต่ฉันมีคำถาม เมื่อฉันปรับขนาดเป็นความละเอียดที่เล็กลงโดยที่คุณภาพไม่เปลี่ยนแปลงคุณภาพของภาพที่แสดงจะต่ำลง ก่อนหน้านี้เคยมีสิ่งที่คล้ายกันเกิดขึ้นกับคุณหรือไม่ เพราะยังไม่พบทางออก.
Hema_Elmasry

6

( สำคัญ : ในกรณีของการปรับขนาดภาพเคลื่อนไหว (ภาพเคลื่อนไหว webp หรือ gif) ผลลัพธ์ที่ได้จะไม่ใช่ภาพเคลื่อนไหว แต่ปรับขนาดภาพจากเฟรมแรก! (ภาพเคลื่อนไหวต้นฉบับยังคงเหมือนเดิม ... )

ฉันสร้างสิ่งนี้ในโครงการphp 7.2ของฉัน(ตัวอย่าง imagebmp sure (PHP 7> = 7.2.0): php / manual / function.imagebmp ) เกี่ยวกับtechfry.com/php-tutorialด้วย GD2 (จึงไม่มีไลบรารีของบุคคลที่สาม) และ คล้ายกับคำตอบของ Nico Bistolfi แต่ใช้งานได้กับ mimetype ภาพพื้นฐานทั้งห้า ( png, jpeg, webp, bmp และ gif ) สร้างไฟล์ที่ปรับขนาดใหม่โดยไม่ต้องแก้ไขไฟล์ต้นฉบับและทุกอย่างในฟังก์ชันเดียวและ พร้อมใช้งาน (คัดลอกและวางในโครงการของคุณ) (คุณสามารถตั้งค่าส่วนขยายของไฟล์ใหม่ด้วยพารามิเตอร์ที่ห้าหรือปล่อยทิ้งไว้หากคุณต้องการคงออร์ซิกนัลไว้):

function createResizedImage(
    string $imagePath = '',
    string $newPath = '',
    int $newWidth = 0,
    int $newHeight = 0,
    string $outExt = 'DEFAULT'
) : ?string
{
    if (!$newPath or !file_exists ($imagePath)) {
        return null;
    }

    $types = [IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_GIF, IMAGETYPE_BMP, IMAGETYPE_WEBP];
    $type = exif_imagetype ($imagePath);

    if (!in_array ($type, $types)) {
        return null;
    }

    list ($width, $height) = getimagesize ($imagePath);

    $outBool = in_array ($outExt, ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp']);

    switch ($type) {
        case IMAGETYPE_JPEG:
            $image = imagecreatefromjpeg ($imagePath);
            if (!$outBool) $outExt = 'jpg';
            break;
        case IMAGETYPE_PNG:
            $image = imagecreatefrompng ($imagePath);
            if (!$outBool) $outExt = 'png';
            break;
        case IMAGETYPE_GIF:
            $image = imagecreatefromgif ($imagePath);
            if (!$outBool) $outExt = 'gif';
            break;
        case IMAGETYPE_BMP:
            $image = imagecreatefrombmp ($imagePath);
            if (!$outBool) $outExt = 'bmp';
            break;
        case IMAGETYPE_WEBP:
            $image = imagecreatefromwebp ($imagePath);
            if (!$outBool) $outExt = 'webp';
    }

    $newImage = imagecreatetruecolor ($newWidth, $newHeight);

    //TRANSPARENT BACKGROUND
    $color = imagecolorallocatealpha ($newImage, 0, 0, 0, 127); //fill transparent back
    imagefill ($newImage, 0, 0, $color);
    imagesavealpha ($newImage, true);

    //ROUTINE
    imagecopyresampled ($newImage, $image, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);

    // Rotate image on iOS
    if(function_exists('exif_read_data') && $exif = exif_read_data($imagePath, 'IFD0'))
    {
        if(isset($exif['Orientation']) && isset($exif['Make']) && !empty($exif['Orientation']) && preg_match('/(apple|ios|iphone)/i', $exif['Make'])) {
            switch($exif['Orientation']) {
                case 8:
                    if ($width > $height) $newImage = imagerotate($newImage,90,0);
                    break;
                case 3:
                    $newImage = imagerotate($newImage,180,0);
                    break;
                case 6:
                    $newImage = imagerotate($newImage,-90,0);
                    break;
            }
        }
    }

    switch (true) {
        case in_array ($outExt, ['jpg', 'jpeg']): $success = imagejpeg ($newImage, $newPath);
            break;
        case $outExt === 'png': $success = imagepng ($newImage, $newPath);
            break;
        case $outExt === 'gif': $success = imagegif ($newImage, $newPath);
            break;
        case  $outExt === 'bmp': $success = imagebmp ($newImage, $newPath);
            break;
        case  $outExt === 'webp': $success = imagewebp ($newImage, $newPath);
    }

    if (!$success) {
        return null;
    }

    return $newPath;
}

คุณทำได้ดีมาก! นี่เป็นวิธีที่ง่ายและสะอาด ฉันมีปัญหากับโมดูล Imagick และแก้ปัญหาด้วยคลาสง่ายๆนี้ ขอบคุณ!
Ivijan Stefan Stipić

เยี่ยมมากถ้าคุณต้องการฉันสามารถเพิ่มการอัปเดตอื่นได้ในภายหลังฉันจะปรับปรุงเล็กน้อย
Ivijan Stefan Stipić

แน่! ฉันยังไม่มีเวลาสร้างส่วนปรับขนาดภาพเคลื่อนไหว ...
danigore

@danigore วิธีปรับขนาดภาพดิบ ( .cr2, .dng, .nefและไลค์)? GD2 ไม่มีการสนับสนุนใด ๆ และหลังจากการต่อสู้มากมายฉันก็สามารถตั้งค่า ImageMagick ได้ แต่ล้มเหลวด้วยข้อผิดพลาดการหมดเวลาการเชื่อมต่อขณะอ่านไฟล์ และไม่มีบันทึกข้อผิดพลาดด้วย ..
กฤษณะ

1
@danigore ฉันเพิ่มฟังก์ชั่นการหมุนภาพอัตโนมัติของคุณเพื่อแก้ไขปัญหา Apple
Ivijan Stefan Stipić

2

นี่คือคำตอบเพิ่มเติมที่ @Ian Atkin 'ให้ ฉันพบว่ามันทำงานได้ดีมาก สำหรับภาพขนาดใหญ่นั่นคือ :) คุณสามารถทำให้ภาพขนาดเล็กใหญ่ขึ้นได้หากคุณไม่ระมัดระวัง การเปลี่ยนแปลง: - รองรับไฟล์ jpg, jpeg, png, gif, bmp - รักษาความโปร่งใสสำหรับ. png และ. gif - ตรวจสอบอีกครั้งว่าขนาดของต้นฉบับไม่ได้เล็กลงแล้วหรือไม่ - แทนที่ภาพที่ให้โดยตรง (เป็นสิ่งที่ฉันต้องการ)

ดังนั้นนี่คือ ค่าเริ่มต้นของฟังก์ชันคือ "กฎทอง"

function resize_image($file, $w = 1200, $h = 741, $crop = false)
   {
       try {
           $ext = pathinfo(storage_path() . $file, PATHINFO_EXTENSION);
           list($width, $height) = getimagesize($file);
           // if the image is smaller we dont resize
           if ($w > $width && $h > $height) {
               return true;
           }
           $r = $width / $height;
           if ($crop) {
               if ($width > $height) {
                   $width = ceil($width - ($width * abs($r - $w / $h)));
               } else {
                   $height = ceil($height - ($height * abs($r - $w / $h)));
               }
               $newwidth = $w;
               $newheight = $h;
           } else {
               if ($w / $h > $r) {
                   $newwidth = $h * $r;
                   $newheight = $h;
               } else {
                   $newheight = $w / $r;
                   $newwidth = $w;
               }
           }
           $dst = imagecreatetruecolor($newwidth, $newheight);

           switch ($ext) {
               case 'jpg':
               case 'jpeg':
                   $src = imagecreatefromjpeg($file);
                   break;
               case 'png':
                   $src = imagecreatefrompng($file);
                   imagecolortransparent($dst, imagecolorallocatealpha($dst, 0, 0, 0, 127));
                   imagealphablending($dst, false);
                   imagesavealpha($dst, true);
                   break;
               case 'gif':
                   $src = imagecreatefromgif($file);
                   imagecolortransparent($dst, imagecolorallocatealpha($dst, 0, 0, 0, 127));
                   imagealphablending($dst, false);
                   imagesavealpha($dst, true);
                   break;
               case 'bmp':
                   $src = imagecreatefrombmp($file);
                   break;
               default:
                   throw new Exception('Unsupported image extension found: ' . $ext);
                   break;
           }
           $result = imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
           switch ($ext) {
               case 'bmp':
                   imagewbmp($dst, $file);
                   break;
               case 'gif':
                   imagegif($dst, $file);
                   break;
               case 'jpg':
               case 'jpeg':
                   imagejpeg($dst, $file);
                   break;
               case 'png':
                   imagepng($dst, $file);
                   break;
           }
           return true;
       } catch (Exception $err) {
           // LOG THE ERROR HERE 
           return false;
       }
   }

ฟังก์ชั่นที่ยอดเยี่ยม @DanielDoinov - ขอบคุณสำหรับการโพสต์ - คำถามด่วน: มีวิธีส่งเฉพาะความกว้างและปล่อยให้ฟังก์ชันปรับความสูงตามภาพต้นฉบับหรือไม่ กล่าวอีกนัยหนึ่งคือถ้าต้นฉบับคือ 400x200 เราสามารถบอกฟังก์ชันที่เราต้องการให้ความกว้างใหม่เป็น 200 ได้หรือไม่และให้ฟังก์ชันคิดว่าความสูงควรเป็น 100 ได้หรือไม่?
marcnyc

$w === $width && $h === $heightเกี่ยวกับเงื่อนไขการแสดงออกของคุณผมไม่คิดว่ามันจะทำให้ความรู้สึกในการดำเนินการเทคนิคการปรับขนาดถ้า ลองคิดดูสิ ควรจะเป็น>=และ>=เปรียบเทียบ @ Daniel
mickmackusa

1

เค้ก ZF:

<?php

class FkuController extends Zend_Controller_Action {

  var $image;
  var $image_type;

  public function store_uploaded_image($html_element_name, $new_img_width, $new_img_height) {

    $target_dir = APPLICATION_PATH  . "/../public/1/";
    $target_file = $target_dir . basename($_FILES[$html_element_name]["name"]);

    //$image = new SimpleImage();
    $this->load($_FILES[$html_element_name]['tmp_name']);
    $this->resize($new_img_width, $new_img_height);
    $this->save($target_file);
    return $target_file; 
    //return name of saved file in case you want to store it in you database or show confirmation message to user



  public function load($filename) {

      $image_info = getimagesize($filename);
      $this->image_type = $image_info[2];
      if( $this->image_type == IMAGETYPE_JPEG ) {

         $this->image = imagecreatefromjpeg($filename);
      } elseif( $this->image_type == IMAGETYPE_GIF ) {

         $this->image = imagecreatefromgif($filename);
      } elseif( $this->image_type == IMAGETYPE_PNG ) {

         $this->image = imagecreatefrompng($filename);
      }
   }
  public function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {

      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image,$filename,$compression);
      } elseif( $image_type == IMAGETYPE_GIF ) {

         imagegif($this->image,$filename);
      } elseif( $image_type == IMAGETYPE_PNG ) {

         imagepng($this->image,$filename);
      }
      if( $permissions != null) {

         chmod($filename,$permissions);
      }
   }
  public function output($image_type=IMAGETYPE_JPEG) {

      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image);
      } elseif( $image_type == IMAGETYPE_GIF ) {

         imagegif($this->image);
      } elseif( $image_type == IMAGETYPE_PNG ) {

         imagepng($this->image);
      }
   }
  public function getWidth() {

      return imagesx($this->image);
   }
  public function getHeight() {

      return imagesy($this->image);
   }
  public function resizeToHeight($height) {

      $ratio = $height / $this->getHeight();
      $width = $this->getWidth() * $ratio;
      $this->resize($width,$height);
   }

  public function resizeToWidth($width) {
      $ratio = $width / $this->getWidth();
      $height = $this->getheight() * $ratio;
      $this->resize($width,$height);
   }

  public function scale($scale) {
      $width = $this->getWidth() * $scale/100;
      $height = $this->getheight() * $scale/100;
      $this->resize($width,$height);
   }

  public function resize($width,$height) {
      $new_image = imagecreatetruecolor($width, $height);
      imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
      $this->image = $new_image;
   }

  public function savepicAction() {
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);

    $this->_helper->layout()->disableLayout();
    $this->_helper->viewRenderer->setNoRender();
    $this->_response->setHeader('Access-Control-Allow-Origin', '*');

    $this->db = Application_Model_Db::db_load();        
    $ouser = $_POST['ousername'];


      $fdata = 'empty';
      if (isset($_FILES['picture']) && $_FILES['picture']['size'] > 0) {
        $file_size = $_FILES['picture']['size'];
        $tmpName  = $_FILES['picture']['tmp_name'];  

        //Determine filetype
        switch ($_FILES['picture']['type']) {
            case 'image/jpeg': $ext = "jpg"; break;
            case 'image/png': $ext = "png"; break;
            case 'image/jpg': $ext = "jpg"; break;
            case 'image/bmp': $ext = "bmp"; break;
            case 'image/gif': $ext = "gif"; break;
            default: $ext = ''; break;
        }

        if($ext) {
          //if($file_size<400000) {  
            $img = $this->store_uploaded_image('picture', 90,82);
            //$fp      = fopen($tmpName, 'r');
            $fp = fopen($img, 'r');
            $fdata = fread($fp, filesize($tmpName));        
            $fdata = base64_encode($fdata);
            fclose($fp);

          //}
        }

      }

      if($fdata=='empty'){

      }
      else {
        $this->db->update('users', 
          array(
            'picture' => $fdata,             
          ), 
          array('username=?' => $ouser ));        
      }



  }  

1

ฉันพบวิธีทางคณิตศาสตร์เพื่อให้งานนี้สำเร็จ

Github repo - https://github.com/gayanSandamal/easy-php-image-resizer

ตัวอย่างสด - https://plugins.nayague.com/easy-php-image-resizer/

<?php
//path for the image
$source_url = '2018-04-01-1522613288.PNG';

//separate the file name and the extention
$source_url_parts = pathinfo($source_url);
$filename = $source_url_parts['filename'];
$extension = $source_url_parts['extension'];

//define the quality from 1 to 100
$quality = 10;

//detect the width and the height of original image
list($width, $height) = getimagesize($source_url);
$width;
$height;

//define any width that you want as the output. mine is 200px.
$after_width = 200;

//resize only when the original image is larger than expected with.
//this helps you to avoid from unwanted resizing.
if ($width > $after_width) {

    //get the reduced width
    $reduced_width = ($width - $after_width);
    //now convert the reduced width to a percentage and round it to 2 decimal places
    $reduced_radio = round(($reduced_width / $width) * 100, 2);

    //ALL GOOD! let's reduce the same percentage from the height and round it to 2 decimal places
    $reduced_height = round(($height / 100) * $reduced_radio, 2);
    //reduce the calculated height from the original height
    $after_height = $height - $reduced_height;

    //Now detect the file extension
    //if the file extension is 'jpg', 'jpeg', 'JPG' or 'JPEG'
    if ($extension == 'jpg' || $extension == 'jpeg' || $extension == 'JPG' || $extension == 'JPEG') {
        //then return the image as a jpeg image for the next step
        $img = imagecreatefromjpeg($source_url);
    } elseif ($extension == 'png' || $extension == 'PNG') {
        //then return the image as a png image for the next step
        $img = imagecreatefrompng($source_url);
    } else {
        //show an error message if the file extension is not available
        echo 'image extension is not supporting';
    }

    //HERE YOU GO :)
    //Let's do the resize thing
    //imagescale([returned image], [width of the resized image], [height of the resized image], [quality of the resized image]);
    $imgResized = imagescale($img, $after_width, $after_height, $quality);

    //now save the resized image with a suffix called "-resized" and with its extension. 
    imagejpeg($imgResized, $filename . '-resized.'.$extension);

    //Finally frees any memory associated with image
    //**NOTE THAT THIS WONT DELETE THE IMAGE
    imagedestroy($img);
    imagedestroy($imgResized);
}
?>

0

คุณสามารถลองใช้ไลบรารี TinyPNG PHP ได้ การใช้ไลบรารีนี้รูปภาพของคุณจะได้รับการปรับให้เหมาะสมโดยอัตโนมัติในระหว่างกระบวนการปรับขนาด ทั้งหมดที่คุณจำเป็นต้องติดตั้งห้องสมุดและได้รับคีย์ API จากhttps://tinypng.com/developers ในการติดตั้งไลบรารีให้รันคำสั่งด้านล่าง

composer require tinify/tinify

หลังจากนั้นรหัสของคุณจะเป็นดังนี้

require_once("vendor/autoload.php");

\Tinify\setKey("YOUR_API_KEY");

$source = \Tinify\fromFile("large.jpg"); //image to be resize
$resized = $source->resize(array(
    "method" => "fit",
    "width" => 150,
    "height" => 100
));
$resized->toFile("thumbnail.jpg"); //resized image

ฉันเขียนบล็อกในหัวข้อเดียวกันhttp://artisansweb.net/resize-image-php-using-tinypng


0

ฉันขอแนะนำวิธีง่ายๆ:

function resize($file, $width, $height) {
    switch(pathinfo($file)['extension']) {
        case "png": return imagepng(imagescale(imagecreatefrompng($file), $width, $height), $file);
        case "gif": return imagegif(imagescale(imagecreatefromgif($file), $width, $height), $file);
        default : return imagejpeg(imagescale(imagecreatefromjpeg($file), $width, $height), $file);
    }
}

0
private function getTempImage($url, $tempName){
  $tempPath = 'tempFilePath' . $tempName . '.png';
  $source_image = imagecreatefrompng($url); // check type depending on your necessities.
  $source_imagex = imagesx($source_image);
  $source_imagey = imagesy($source_image);
  $dest_imagex = 861; // My default value
  $dest_imagey = 96;  // My default value

  $dest_image = imagecreatetruecolor($dest_imagex, $dest_imagey);

  imagecopyresampled($dest_image, $source_image, 0, 0, 0, 0, $dest_imagex, $dest_imagey, $source_imagex, $source_imagey);

  imagejpeg($dest_image, $tempPath, 100);

  return $tempPath;

}

นี้เป็นทางออกที่ดัดแปลงบนพื้นฐานนี้คำอธิบายที่ดี ผู้ชายคนนี้อธิบายทีละขั้นตอน หวังว่าทุกคนจะสนุกกับมัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.