Thay đổi kích thước hình ảnh trong PHP


96

Tôi muốn viết một số mã PHP để tự động thay đổi kích thước bất kỳ hình ảnh nào được tải lên qua biểu mẫu thành 147x147px, nhưng tôi không biết phải làm thế nào về nó (tôi là một người mới làm quen với PHP).

Cho đến nay, tôi đã tải lên hình ảnh thành công, các loại tệp được nhận dạng và tên đã được xóa sạch, nhưng tôi muốn thêm chức năng thay đổi kích thước vào mã. Ví dụ: tôi có một hình ảnh thử nghiệm có kích thước 2,3MB và kích thước 1331x1331 và tôi muốn mã giảm kích thước nó xuống, điều mà tôi đoán sẽ nén đáng kể kích thước tệp của hình ảnh.

Cho đến nay, tôi đã có những điều sau:

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);

Bạn đã thử các mẫu thích này stackoverflow.com/questions/10029838/image-resize-with-php chưa?
Coenie Richards

mà không cần thay đổi upload_max_filesizetrong php.ini, trước hết là có thể tải lên tệp có kích thước lớn hơn upload_max_filesizekhông ?. Có cơ hội nào để thay đổi kích thước hình ảnh có kích thước lớn hơn upload_max_filesizekhông? mà không thay đổi upload_max_filesizetrongphp.ini
rch

Câu trả lời:


140

Bạn cần sử dụng hàm ImageMagick hoặc GD của PHP để làm việc với hình ảnh.

Với GD, chẳng hạn, nó đơn giản như ...

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;
}

Và bạn có thể gọi hàm này, giống như vậy ...

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

Từ kinh nghiệm cá nhân, việc lấy lại mẫu hình ảnh của GD cũng làm giảm đáng kể kích thước tệp, đặc biệt là khi lấy mẫu lại hình ảnh máy ảnh kỹ thuật số thô.


Cảm ơn! Thứ lỗi cho sự thiếu hiểu biết của tôi, nhưng nó sẽ nằm ở đâu trong mã mà tôi đã có, và lệnh gọi hàm sẽ nằm ở đâu? Tôi có đúng khi nói rằng nơi tôi đã INSERT cơ sở dữ liệu của mình, thay vì chèn $ n, tôi sẽ chèn $ img? Hay $ n sẽ được cấu trúc $ n = ($ img = resize_image ('/ path / to / some / image.jpg', 200, 200));?
Alex Ryans

1
Bạn có đang lưu trữ hình ảnh dưới dạng BLOBs không? Tôi khuyên bạn nên lưu trữ hình ảnh trong hệ thống tệp và chèn các tham chiếu vào cơ sở dữ liệu của bạn. Tôi cũng khuyên bạn nên đọc toàn bộ tài liệu GD (hoặc ImageMagick) để xem bạn có những tùy chọn nào khác.
Ian Atkin

17
Lưu ý, giải pháp này chỉ hoạt động đối với ảnh JPEG. Bạn có thể thay thế imageecreatefromjpeg bằng bất kỳ hình thức nào sau đây: virtualecreatefromgd, virtualecreatefromgif, virtualecreatefrompng, virtualecreatefromstring, virtualecreatefromwbmp, Imagecreatefromxbm, Imagecreatefromxpm để xử lý các loại hình ảnh khác nhau.
Chris Hanson

2
@GordonFreeman Cảm ơn vì đoạn mã tuyệt vời, nhưng có một trục trặc ở đó, hãy thêm abs(), giống ceil($width-($width*abs($r-$w/$h)))và tương tự vào phần chiều cao. Nó cần thiết cho một số trường hợp.
Arman P.

4
Để lưu hình ảnh đã thay đổi kích thước trong hệ thống tệp, hãy thêm imagejpeg($dst, $file);vào sau imagecopyresampled($dst,...dòng. Thay đổi $filenếu bạn không muốn ghi đè lên bản gốc.
wkille

23

Tài nguyên này (liên kết bị hỏng) cũng đáng được xem xét - một số mã rất gọn gàng sử dụng GD. Tuy nhiên, tôi đã sửa đổi đoạn mã cuối cùng của họ để tạo ra hàm này đáp ứng các yêu cầu OP ...

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
    
}

Bạn cũng sẽ cần phải bao gồm tệp PHP này ...

<?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
Mẫu của bạn là tốt nhất. nó hoạt động trực tiếp trong khuôn khổ Zend mà không tạo ra hài kịch, chính kịch, giật tóc. thumbs up

Tôi nghĩ rằng tất cả mã bạn cần phải có trong câu trả lời của tôi, nhưng điều này cũng có thể hữu ích: gist.github.com/arrowmedia/7863973 .
ban-geoengineering

19

Hàm sử dụng đơn giản PHP ( tỷ lệ hình ảnh ):

Cú pháp:

imagescale ( $image , $new_width , $new_height )

Thí dụ:

Bước: 1 Đọc tệp

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

Bước: 2: Tải tệp hình ảnh

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

Bước: 3: Người bảo vệ sự sống của chúng ta xuất hiện trong '_' | Chia tỷ lệ hình ảnh

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

Lưu ý: imagescale sẽ hoạt động cho (PHP 5> = 5.5.0, PHP 7)

Nguồn: Bấm để đọc thêm


Giải pháp tốt nhất cho PHP 5.6.3>
Pattycake Jr

12

Nếu bạn không quan tâm đến tỷ lệ khung hình (tức là bạn muốn ép hình ảnh vào một kích thước cụ thể), đây là một câu trả lời đơn giản

// 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;
}

Bây giờ chúng ta hãy xử lý phần tải lên. Bước đầu tiên, tải tệp lên thư mục mong muốn của bạn. Sau đó, gọi một trong các hàm trên dựa trên loại tệp (jpg, png hoặc gif) và chuyển đường dẫn tuyệt đối của tệp tải lên của bạn như bên dưới:

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

Giá trị trả về $imglà một đối tượng tài nguyên. Chúng tôi có thể lưu vào một vị trí mới hoặc ghi đè bản gốc như sau:

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

Hy vọng điều này sẽ giúp ai đó. Kiểm tra các liên kết này để biết thêm về cách thay đổi kích thước Imagick :: resizeImageimagejpeg ()


mà không thay đổi upload_max_filesizetrong php.ini, trước hết bạn không thể tải lên tệp có kích thước lớn hơn upload_max_filesize. Có cơ hội để thay đổi kích thước hình có kích thước hơn upload_max_filesizemà không thay đổi upload_max_filesizetrongphp.ini
rch

6

Tôi hy vọng là sẽ làm việc cho bạn.

/**
         * 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

( QUAN TRỌNG : Trong trường hợp thay đổi kích thước hoạt ảnh (webp động hoặc gif), kết quả sẽ là hình ảnh không hoạt hình, nhưng đã thay đổi kích thước từ khung hình đầu tiên! (Hoạt ảnh gốc vẫn còn nguyên ...)

Tôi đã tạo điều này cho dự án php 7.2 của mình (chắc chắn là imagebmp (PHP 7> = 7.2.0): php / manual / function.imagebmp ) về techfry.com/php-tutorial , với GD2, (vì vậy không có thư viện của bên thứ 3) và rất giống với câu trả lời của Nico Bistolfi, nhưng hoạt động với tất cả năm kiểu mimetype hình ảnh cơ bản ( png, jpeg, webp, bmp và gif ), tạo một tệp được thay đổi kích thước mới mà không cần sửa đổi tệp gốc và tất cả nội dung trong một chức năng và sẵn sàng sử dụng (sao chép và dán vào dự án của bạn). (Bạn có thể đặt phần mở rộng của tệp mới bằng tham số thứ năm hoặc chỉ để lại nó, nếu bạn muốn giữ nguyên):

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;
}

Bạn tuyệt lắm! Đây là giải pháp đơn giản và sạch sẽ. Tôi đã gặp sự cố với mô-đun Imagick và giải quyết vấn đề với lớp đơn giản này. Cảm ơn!
Ivijan Stefan Stipić

Tuyệt vời, Nếu bạn muốn, tôi có thể thêm một bản cập nhật khác sau, tôi cải thiện điều này một chút.
Ivijan Stefan Stipić

chắc chắn rồi! Tôi vẫn chưa có thời gian để xây dựng hình ảnh động thay đổi kích thước một phần ...
danigore

@danigore, làm cách nào để thay đổi kích thước hình ảnh thô ( .cr2, .dng, .nefvà các lượt thích)? GD2 không có bất kỳ sự hỗ trợ nào và sau rất nhiều khó khăn, tôi đã có thể thiết lập ImageMagick. Tuy nhiên, nó không thành công với lỗi thời gian chờ kết nối trong khi đọc tệp. Và, cũng không có nhật ký lỗi ..
Krishna Chebrolu

1
@danigore Tôi thêm vào chức năng tự động xoay hình ảnh của bạn để khắc phục sự cố của Apple.
Ivijan Stefan Stipić

5

Tôi đã tạo một thư viện dễ sử dụng để thay đổi kích thước hình ảnh. Nó có thể được tìm thấy ở đây trên Github .

Một ví dụ về cách sử dụng thư viện:

// 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');

Các tính năng khác, nếu bạn cần, là:

  • Thay đổi kích thước nhanh chóng và dễ dàng - Thay đổi kích thước thành ngang, dọc hoặc tự động
  • Cây trồng dễ dàng
  • Thêm văn bản
  • Điều chỉnh chất lượng
  • Watermarking
  • Bóng và phản xạ
  • Hỗ trợ minh bạch
  • Đọc siêu dữ liệu EXIF
  • Đường viền, Góc tròn, Xoay
  • Bộ lọc và hiệu ứng
  • Làm sắc nét hình ảnh
  • Chuyển đổi loại hình ảnh
  • Hỗ trợ BMP

Điều này đã cứu ngày của tôi. Tuy nhiên, có một thông báo nhỏ mà tôi gửi cho một người đã tìm kiếm trong 3 ngày như tôi và sắp mất hy vọng tìm ra bất kỳ giải pháp thay đổi kích thước nào. Nếu bạn thấy thông báo chỉ mục không xác định trong tương lai, chỉ cần xem liên kết này: github.com/Oberto/php-image-magician/pull/16/commits Và áp dụng các thay đổi cho tệp. Nó sẽ hoạt động 100% mà không có bất kỳ vấn đề nào.
Hema_Elmasry

1
Này, @Hema_Elmasry. FYI, tôi vừa mới hợp nhất những thay đổi đó thành chính :)
Jarrod

Ok, xin lỗi, tôi không để ý. Nhưng tôi có một câu hỏi. Khi tôi thay đổi kích thước thành độ phân giải nhỏ hơn với chất lượng không thay đổi, chất lượng hình ảnh hiển thị sẽ thấp hơn nhiều. Có điều gì tương tự đã xảy ra với bạn trước đây không? Vì tôi vẫn chưa tìm ra giải pháp.
Hema_Elmasry

2

Đây là phiên bản mở rộng của câu trả lời mà @Ian Atkin 'đã đưa ra. Tôi thấy nó hoạt động rất tốt. Đối với hình ảnh lớn hơn đó là :). Bạn thực sự có thể làm cho hình ảnh nhỏ hơn lớn hơn nếu bạn không cẩn thận. Các thay đổi: - Hỗ trợ các tệp jpg, jpeg, png, gif, bmp - Duy trì độ trong suốt cho .png và .gif - Kiểm tra lại xem kích thước của hình gốc chưa nhỏ hơn chưa - Ghi đè hình ảnh được cung cấp trực tiếp (Đó là những gì tôi cần)

Vì vậy, nó đây. Các giá trị mặc định của hàm là "quy tắc vàng"

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;
       }
   }

Chức năng tuyệt vời @DanielDoinov - cảm ơn bạn đã đăng nó - câu hỏi nhanh: có cách nào để chỉ truyền chiều rộng và để chức năng điều chỉnh tương đối chiều cao dựa trên hình ảnh gốc không? Nói cách khác, nếu ban đầu là 400x200, chúng ta có thể cho hàm chúng ta muốn chiều rộng mới là 200 và để hàm tìm ra rằng chiều cao phải là 100 không?
marcnyc

Về biểu thức điều kiện của bạn, tôi không nghĩ rằng việc thực thi kỹ thuật thay đổi kích thước nếu có là điều hợp lý $w === $width && $h === $height. Hãy suy nghĩ về nó. Nên >=>=so sánh. @Daniel
mickmackusa

1

Bánh 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

Tôi đã tìm ra một cách toán học để hoàn thành công việc này

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

Ví dụ trực tiếp - 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

Bạn có thể dùng thử thư viện TinyPNG PHP. Sử dụng thư viện này, hình ảnh của bạn sẽ tự động được tối ưu hóa trong quá trình thay đổi kích thước. Tất cả những gì bạn cần để cài đặt thư viện và nhận khóa API từ https://tinypng.com/developers . Để cài đặt thư viện, hãy chạy lệnh dưới đây.

composer require tinify/tinify

Sau đó, mã của bạn như sau.

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

Tôi đã viết một blog về chủ đề tương tự http://artisansweb.net/resize-image-php-using-tinypng


0

Tôi sẽ đề xuất một cách dễ dàng:

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;

}

Đây là một giải pháp được điều chỉnh dựa trên lời giải thích tuyệt vời này . Anh chàng này đã giải thích từng bước một. Hy vọng tất cả sẽ thích nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.