2012-03-10 36 views
12

Trong một trong các ứng dụng của tôi, tôi đang sử dụng đoạn mã dưới đây để sao chép hình ảnh đã tải lên vào một thư mục. Nó hoạt động tốt nhưng sao chép hình ảnh lớn (> 2MB) mất nhiều thời gian hơn lý tưởng và tôi thực sự không cần hình ảnh này lớn, vì vậy, tôi đang tìm kiếm một cách để thay đổi kích thước hình ảnh. Làm thế nào để đạt được điều này bằng cách sử dụng PHP?Thay đổi kích thước hình ảnh trong PHP mà không cần sử dụng thư viện của bên thứ ba?

<?php 

$uploadDirectory = 'images/0001/'; 
$randomNumber = rand(0, 99999); 
$filename = basename($_FILES['userfile']['name']); 
$filePath = $uploadDirectory.md5($randomNumber.$filename); 

// Check if the file was sent through HTTP POST. 

if (is_uploaded_file($_FILES['userfile']['tmp_name']) == true) { 

    // Validate the file size, accept files under 5 MB (~5e+6 bytes). 

    if ($_FILES['userfile']['size'] <= 5000000) { 

     // Move the file to the path specified. 

     if (move_uploaded_file($_FILES['userfile']['tmp_name'], $filePath) == true) { 

      // ... 

     } 

    } 

} 

?> 
+0

http://www.white-hat-web-design.co.uk/blog/resizing-images-with-php/ tập tin – Ghostman

+2

séc kích thước * trước khi * tải lên, http://stackoverflow.com/questions/4112575/client-checking-file-size-using-html5 – Teson

+0

bản sao có thể có của [Đổi kích thước hình ảnh trên máy chủ] (http://stackoverflow.com/questions/ 7911293/resize-image-on-server) – Phil

Trả lời

31

Cuối cùng, tôi đã khám phá ra cách phù hợp với nhu cầu của mình. Đoạn mã sau sẽ thay đổi kích thước hình ảnh thành chiều rộng được chỉ định, tự động tính toán chiều cao để giữ tỷ lệ.

$image = $_FILES["image"]["tmp_name"]; 
$resizedDestination = $uploadDirectory.md5($randomNumber.$filename)."_RESIZED.jpg"; 

copy($_FILES, $resizedDestination); 

$imageSize = getImageSize($image); 
$imageWidth = $imageSize[0]; 
$imageHeight = $imageSize[1]; 

$DESIRED_WIDTH = 100; 
$proportionalHeight = round(($DESIRED_WIDTH * $imageHeight)/$imageWidth); 

$originalImage = imageCreateFromJPEG($image); 

$resizedImage = imageCreateTrueColor($DESIRED_WIDTH, $proportionalHeight); 

imageCopyResampled($images_fin, $originalImage, 0, 0, 0, 0, $DESIRED_WIDTH+1, $proportionalHeight+1, $imageWidth, $imageHeight); 
imageJPEG($resizedImage, $resizedDestination); 

imageDestroy($originalImage); 
imageDestroy($resizedImage); 

Để ai tìm kiếm một ví dụ hoàn chỉnh, tạo ra hai tập tin:

<!-- send.html --> 

<html> 

<head> 

    <title>Simple File Upload</title> 

</head> 

<body> 

    <center> 

     <div style="margin-top:50px; padding:20px; border:1px solid #CECECE;"> 

      Select an image. 

      <br/> 
      <br/> 

      <form action="receive.php" enctype="multipart/form-data" method="post"> 
       <input type="file" name="image" size="40"> 
       <input type="submit" value="Send"> 
      </form> 

     </div> 

    </center> 

</body> 

<?php 

// receive.php 

$randomNumber = rand(0, 99999); 
$uploadDirectory = "images/"; 
$filename = basename($_FILES['file_contents']['name']); 
$destination = $uploadDirectory.md5($randomNumber.$filename).".jpg"; 

echo "File path:".$filePath."<br/>"; 

if (is_uploaded_file($_FILES["image"]["tmp_name"]) == true) { 

    echo "File successfully received through HTTP POST.<br/>"; 

    // Validate the file size, accept files under 5 MB (~5e+6 bytes). 

    if ($_FILES['image']['size'] <= 5000000) { 

     echo "File size: ".$_FILES["image"]["size"]." bytes.<br/>"; 

     // Resize and save the image. 

     $image = $_FILES["image"]["tmp_name"]; 
     $resizedDestination = $uploadDirectory.md5($randomNumber.$filename)."_RESIZED.jpg"; 

     copy($_FILES, $resizedDestination); 

     $imageSize = getImageSize($image); 
     $imageWidth = $imageSize[0]; 
     $imageHeight = $imageSize[1]; 

     $DESIRED_WIDTH = 100; 
     $proportionalHeight = round(($DESIRED_WIDTH * $imageHeight)/$imageWidth); 

     $originalImage = imageCreateFromJPEG($image); 

     $resizedImage = imageCreateTrueColor($DESIRED_WIDTH, $proportionalHeight); 

     imageCopyResampled($images_fin, $originalImage, 0, 0, 0, 0, $DESIRED_WIDTH+1, $proportionalHeight+1, $imageWidth, $imageHeight); 
     imageJPEG($resizedImage, $resizedDestination); 

     imageDestroy($originalImage); 
     imageDestroy($resizedImage); 

     // Save the original image. 

     if (move_uploaded_file($_FILES['image']['tmp_name'], $destination) == true) { 

      echo "Copied the original file to the specified destination.<br/>"; 

     } 

    } 

} 

?> 
+2

điều này sẽ tắt tính minh bạch trong các tệp PNG – Nimrod007

+0

@ Nimrod007, chúng tôi có thể thay thế độ trong suốt bằng màu trắng. Đó sẽ là "an toàn" – khandelwaldeval

+0

dòng thứ 3 thực sự làm gì? – MeV

3

ImageMagick là cách nhanh nhất và có lẽ là cách tốt nhất để thay đổi kích thước hình ảnh trong PHP. Xem các ví dụ khác nhau here. Mẫu này cho biết cách để resize and image on upload.

+2

Tại sao phải trải qua quá trình thực hiện một quy trình khác khi bạn có thể sử dụng thư viện đã được chứng minh như GD ? – Overv

+4

@ Tốc độ vượt trội. GD khá chậm http://sven.webiny.com/php-gd-vs-imagemagick-benchmark/. –

8

Tôi đã thực hiện một chức năng để thay đổi kích thước hình ảnh một nửa, mã bên dưới.

 function imgResize($path) { 

      $x = getimagesize($path);    
      $width = $x['0']; 
      $height = $x['1']; 

      $rs_width = $width/2;//resize to half of the original width. 
      $rs_height = $height/2;//resize to half of the original height. 

      switch ($x['mime']) { 
       case "image/gif": 
       $img = imagecreatefromgif($path); 
       break; 
       case "image/jpg": 
       case "image/jpeg": 
       $img = imagecreatefromjpeg($path); 
       break; 
       case "image/png": 
       $img = imagecreatefrompng($path); 
       break; 
      } 

      $img_base = imagecreatetruecolor($rs_width, $rs_height); 
      imagecopyresized($img_base, $img, 0, 0, 0, 0, $rs_width, $rs_height, $width, $height); 

      $path_info = pathinfo($path);  
      switch ($path_info['extension']) { 
       case "gif": 
       imagegif($img_base, $path); 
       break; 
      case "jpg": 
      case "jpeg": 
       imagejpeg($img_base, $path); 
       break; 
       case "png": 
       imagepng($img_base, $path); 
       break; 
      } 

     } 

và bạn sẽ có thể gọi hàm với bên dưới.

$img = imgResize('c:/dir/image.png'); 
+0

Kịch bản hay, nhưng $ img_base đang trả lại id tài nguyên. Bây giờ làm cách nào để lưu hình ảnh đã sửa đổi? –

+0

Cập nhật để lưu hình ảnh. – Jake

+1

Kịch bản hay, mặc dù tôi nghĩ rằng nó cũng cần một trường hợp "jpg", vì nó không nhận ra phần mở rộng đó. –

6

có 1 rất đơn giản chức năng chụp ảnh lại kích thước cho tất cả các loại hình ảnh mà giữ tính minh bạch và rất dễ sử dụng

check out:

https://github.com/Nimrod007/PHP_image_resize

hy vọng điều này giúp

+0

có chức năng gọi lại khi chức năng kích thước hình ảnh hoàn thành không? Ví dụ ... Tôi muốn chạy mã Chỉ Nếu thay đổi kích thước hình ảnh xảy ra. – floor

0

Nhờ Mateus Nunes! i thay đổi nội dung công việc của mình một chút để có được pngs trong suốt làm việc:

$source   = $_FILES["..."]["tmp_name"]; 
$destination = 'abc/def/ghi.png'; 
$maxsize  = 45; 

$size = getimagesize($source); 
$width_orig = $size[0]; 
$height_orig = $size[1]; 
unset($size); 
$height = $maxsize+1; 
$width = $maxsize; 
while($height > $maxsize){ 
    $height = round($width*$height_orig/$width_orig); 
    $width = ($height > $maxsize)?--$width:$width; 
} 
unset($width_orig,$height_orig,$maxsize); 
$images_orig = imagecreatefromstring(file_get_contents($source)); 
$photoX   = imagesx($images_orig); 
$photoY   = imagesy($images_orig); 
$images_fin  = imagecreatetruecolor($width,$height); 
imagesavealpha($images_fin,true); 
$trans_colour = imagecolorallocatealpha($images_fin,0,0,0,127); 
imagefill($images_fin,0,0,$trans_colour); 
unset($trans_colour); 
ImageCopyResampled($images_fin,$images_orig,0,0,0,0,$width+1,$height+1,$photoX,$photoY); 
unset($photoX,$photoY,$width,$height); 
imagepng($images_fin,$destination); 
unset($destination); 
ImageDestroy($images_orig); 
ImageDestroy($images_fin); 
Các vấn đề liên quan