2015-03-04 34 views
7

Tôi cần một cách (bằng cách sử dụng PHP dựng sẵn) để kéo hình ảnh xuống từ URL và lưu nó vào đĩa cục bộ với WIDTH đã được chỉnh lại kích thước/thu nhỏ thành 150px. Tôi đã cố gắng này:PHP - tạo hình thu nhỏ từ url

Creating a thumbnail from an uploaded image

function makeThumbnails($updir, $img, $id) 
{ 
    $thumbnail_width = 134; 
    $thumbnail_height = 189; 
    $thumb_beforeword = "thumb"; 
    $arr_image_details = getimagesize("$updir" . $id . '_' . "$img"); // pass id to thumb name 
    $original_width = $arr_image_details[0]; 
    $original_height = $arr_image_details[1]; 
    if ($original_width > $original_height) { 
     $new_width = $thumbnail_width; 
     $new_height = intval($original_height * $new_width/$original_width); 
    } else { 
     $new_height = $thumbnail_height; 
     $new_width = intval($original_width * $new_height/$original_height); 
    } 
    $dest_x = intval(($thumbnail_width - $new_width)/2); 
    $dest_y = intval(($thumbnail_height - $new_height)/2); 
    if ($arr_image_details[2] == 1) { 
     $imgt = "ImageGIF"; 
     $imgcreatefrom = "ImageCreateFromGIF"; 
    } 
    if ($arr_image_details[2] == 2) { 
     $imgt = "ImageJPEG"; 
     $imgcreatefrom = "ImageCreateFromJPEG"; 
    } 
    if ($arr_image_details[2] == 3) { 
     $imgt = "ImagePNG"; 
     $imgcreatefrom = "ImageCreateFromPNG"; 
    } 
    if ($imgt) { 
     $old_image = $imgcreatefrom("$updir" . $id . '_' . "$img"); 
     $new_image = imagecreatetruecolor($thumbnail_width, $thumbnail_height); 
     imagecopyresized($new_image, $old_image, $dest_x, $dest_y, 0, 0, $new_width, $new_height, $original_width, $original_height); 
     $imgt($new_image, "$updir" . $id . '_' . "$thumb_beforeword" . "$img"); 
    } 
} 

Điều đó có vẻ rất hứa hẹn nhưng tôi không thể tìm ra cách để sử dụng nó, và sau đó cho dù nó sẽ làm những gì tôi muốn. Mối quan tâm/nhu cầu:

  1. Các tham số này có nghĩa là gì: ($updir, $img, $id) - Có phải $updir vị trí của tệp không? Hoặc vị trí tôi muốn lưu? Có phải $img là một tệp xử lý hoặc tên tệp không? Hoặc tên mới của tệp? $id là gì? Tác giả không đưa ra bất kỳ cách sử dụng mẫu nào.
  2. Hàm dường như yêu cầu tôi chỉ định WIDTH và HEIGHT. Tôi chỉ muốn chỉ định WIDTH và để chiều cao được tỷ lệ thuận.
  3. tôi cần phải kéo hình ảnh trên 2 loại khác nhau của URL: (1) Các cơ bản http://foo ..., và (2) cú pháp dữ liệu: data:image/jpeg;base64,/9j/4AAQ....
  4. Lý tưởng nhất là tôi muốn chuyển đổi những hình ảnh này trong mọi trường hợp xuống với hình thu nhỏ jpeg nén (chiều rộng 150px, chiều cao bất kỳ), ngay cả khi hình ảnh gốc không ở định dạng jpg.

Cách tốt nhất để thực hiện việc này là gì?

+0

Cũng kịch bản bạn đăng sẽ giống như cơ sở của nó trên hình ảnh tải lên máy chủ đang chạy trên đó '$ updir' sẽ là đường dẫn đến thư mục chứa chúng và' $ id' và '$ img' là một phần của tên tệp đối với một số loại quy ước đặt tên. Vì vậy, trong ngắn hạn này sẽ chỉ làm việc một khi bạn có các tập tin tải về/sao chép. – prodigitalson

+0

có một cái nhìn tại http://stackoverflow.com/a/27362839/3641016, tôi đã cung cấp một chức năng trợ giúp nhỏ để thay đổi kích thước hình ảnh với các chế độ khác nhau. –

+0

Raphael, bạn đóng đinh nó. Muốn đăng câu trả lời của bạn để tôi có thể cung cấp cho bạn tiền thưởng? – HerrimanCoder

Trả lời

22

Chỉ cần làm điều này:

function Thumbnail($url, $filename, $width = 150, $height = true) { 

// download and create gd image 
$image = ImageCreateFromString(file_get_contents($url)); 

// calculate resized ratio 
// Note: if $height is set to TRUE then we automatically calculate the height based on the ratio 
$height = $height === true ? (ImageSY($image) * $width/ImageSX($image)) : $height; 

// create image 
$output = ImageCreateTrueColor($width, $height); 
ImageCopyResampled($output, $image, 0, 0, 0, 0, $width, $height, ImageSX($image), ImageSY($image)); 

// save image 
ImageJPEG($output, $filename, 95); 

// return resized image 
return $output; // if you need to use it 
} 

Sử dụng nó như thế này:

Thumbnail("http://cdn.cutestpaw.com/wp-content/uploads/2013/01/l-Cute-Kitten.jpg", "kitten.jpg"); 

Bí quyết ở đây là sử dụng nội bộ phát hiện tập tin tự động của PHP cho dòng đến đó là rất tốt xử lý bởi ImageCreateFromString

+1

Andy, tôi đã trao cho bạn vì: (1) Nó hoạt động; (2) bạn không gửi cho tôi thư viện của bên thứ ba; (3) nó tối giản; (4) bạn đã đưa ra một ví dụ làm việc về cách sử dụng nó. Cảm ơn câu trả lời hoàn hảo. – HerrimanCoder

+0

Bạn được chào đón! :-) – flyandi

+0

Cảm ơn bạn @Andy. Giải pháp của bạn hoạt động hoàn hảo. – Pang

1

Bạn có thể sử dụng lớp học SimpleImage này. Bạn có thể thay đổi kích thước hình ảnh trực tiếp từ url và lưu nó trong địa phương của bạn như thế này.

$image = new SimpleImage(); 
$image->load('http://website.com/yourimage.jpg'); 
$image->resize(250,400); 
$image->save('filename.jpg'); 

ví dụ khác có thể tìm thấy here.

1

Các tham số này có nghĩa là gì: ($ updir, $ img, $ id) - Có phải $ updir là vị trí của tệp không? Hoặc vị trí tôi muốn lưu? Là $ img một tập tin xử lý hoặc tên của tập tin? Hoặc tên mới của tệp? $ Id cho là gì? Tác giả không đưa ra bất kỳ cách sử dụng mẫu nào.

  • $updir có vẻ là đường dẫn đến một tập tin trên máy chủ
  • $img là hình ảnh tên file (với phần mở rộng)
  • $id có vẻ là một số tiền tố số (hoàn toàn là tác giả của funciton này có vẻ như) vào tên tệp. Tôi sẽ đổi nó thành $id = '' trong tiêu đề chức năng.
    .

Hàm dường như yêu cầu tôi chỉ định WIDTH và HEIGHT. Tôi chỉ muốn chỉ định WIDTH và để chiều cao được tỷ lệ thuận.

Vâng, bạn có thể sử dụng một số phép tính.Nếu bạn muốn hình ảnh trong hình 4: 3 tỷ lệ bạn có thể làm một số "công thức tỷ lệ" (không biết nếu có bất kỳ tên bằng tiếng Anh):

$thumbnail_width = 1234; 
$thumbnail_height = $thumbnail_width * 3/4; 

Nhưng nếu bạn không biết tỷ lệ và chỉ muốn duy trì tỷ lệ thì tôi nghĩ chức năng này sẽ không giúp bạn. Bạn có thể thử lớp SimpleImage như đã nói trong câu trả lời khác (nó có phương pháp resizeToWidth())
.

Tôi cần kéo hình ảnh qua 2 loại URL khác nhau: (1) Cơ bản http://foo ... và (2) cú pháp dữ liệu: dữ liệu: image/jpeg; base64,/9j/4AAQ .. ..

Vâng, đó là tùy thuộc vào bạn. Bạn đã đăng một hàm ở đây và những gì bạn sẽ vượt qua khi tham số hoàn toàn là vấn đề phụ thuộc. Đối với hình ảnh được mã hóa base64, hãy kiểm tra this topic để biết cách chuyển đổi hình ảnh thành hình ảnh (bạn có thể lưu hình ảnh bằng cách sử dụng file_put_content() thay vì lặp lại hình ảnh đó).
,

Lý tưởng nhất là tôi muốn chuyển đổi những hình ảnh này trong mọi trường hợp xuống đến một thumbnail jpeg nén (150px chiều rộng, chiều cao bất kỳ), ngay cả khi hình ảnh ban đầu không phải là ở định dạng jpg.

Một lần nữa, chức năng bạn đăng hoàn toàn hoạt động trên hình ảnh đầu vào và vì nó hoạt động không thể chuyển đổi qua các loại khác nhau. Một lần nữa, tôi khuyên bạn nên sử dụng lớp SimpleImage.

0

Dưới đây là ví dụ tốt để chuyển url thành hình ảnh. Có vẻ như một chút làm việc xung quanh nhưng nó hoạt động tuyệt vời;) Đối với imagemagick, nếu bạn sử dụng cửa sổ, bạn cần phải thiết lập imagemagick & hiển thị imagemagick dll sang php. Click here

0

Tôi đang cố gắng giải thích nó trong vài bước.

1. getImageSize($name) - nó cần tên hình ảnh để tải hình ảnh. Vì vậy, bạn cần phải cung cấp url tuyệt đối cùng với tên tưởng tượng chính xác với phần mở rộng.

ví dụ: "abc.com/edit/9/xyz.png"

Trong trường hợp trên, theo tham số chức năng của bạn.

  1. abc.com/edit/ là url mặc định của bạn.
  2. $id là id của bạn trong số
  3. hồ sơ cụ thể của bạn. '_' sẽ nối thêm '/' vào url của bạn.
  4. $img là tên hình ảnh của bản ghi cụ thể.

2, Hàm trên sẽ cung cấp cho bạn một mảng, trong đó hai tham số đầu tiên là Chiều cao và Chiều rộng của hình ảnh được truyền trong hàm. vì vậy bạn cần lưu trữ nó trong các biến. $height$width.

3, Tiếp theo nó sẽ kiểm tra chiều cao và chiều rộng, và nếu chiều cao hoặc chiều rộng không theo yêu cầu, thì bạn cần phải đặt nó cho phù hợp.

4, sau đó trong mã, tiếp theo là dest_x và dest_y sẽ giúp bạn trỏ vị trí của hình ảnh của bạn.

Và Đối với hai url khác nhau, bạn có thể lưu trữ các url đó trong biến không đổi và đặt biến cố định này bên trong hàm getImageSize() của bạn.

Các vấn đề liên quan