2012-05-14 43 views
10

Tôi đã tìm thấy một vài điều trên web về PHP + GD liên quan đến thao tác hình ảnh, nhưng dường như không có gì cho tôi những gì tôi đang tìm kiếm.php GD thêm đệm vào hình ảnh

Tôi có ai đó tải lên hình ảnh của bất kỳ thứ nguyên nào, tập lệnh tôi đã viết đổi kích thước hình ảnh thành không quá 200px chiều rộng 200px trong khi vẫn duy trì tỷ lệ khung hình. Vì vậy, hình ảnh cuối cùng có thể là 150px x 200px chẳng hạn. Những gì tôi muốn làm là sau đó thao tác các hình ảnh hơn nữa và thêm một thảm quanh hình ảnh để pad nó đến 200px x 200px trong khi không ảnh hưởng đến hình ảnh ban đầu. Ví dụ:

Unpadded Image 143x200

Padded image 200x200

Code tôi đã để hình ảnh thay đổi kích cỡ là ở đây, tôi đã thử một vài điều, nhưng tôi chắc chắn có một vấn đề thực hiện quá trình thứ cấp thêm padding .

list($imagewidth, $imageheight, $imageType) = getimagesize($image); 
$imageType = image_type_to_mime_type($imageType); 
$newImageWidth = ceil($width * $scale); 
$newImageHeight = ceil($height * $scale); 
$newImage = imagecreatetruecolor($newImageWidth,$newImageHeight); 
switch($imageType) { 
    case "image/gif": 
     $source=imagecreatefromgif($image); 
     break; 
    case "image/pjpeg": 
    case "image/jpeg": 
    case "image/jpg": 
     $source=imagecreatefromjpeg($image); 
     break; 
    case "image/png": 
    case "image/x-png": 
     $source=imagecreatefrompng($image); 
     break; 
} 
imagecopyresampled($newImage,$source,0,0,0,0,$newImageWidth,$newImageHeight,$width,$height); 
imagejpeg($newImage,$image,80); 
chmod($image, 0777); 

Tôi nghĩ mình cần sử dụng imagecopy() ngay sau cuộc gọi imagecopyresampled(). Bằng cách đó, hình ảnh đã là kích thước tôi muốn, tôi chỉ cần tạo một hình ảnh chính xác 200 x 200 và dán $ newImage vào giữa (vert và horiz) của nó. Tôi có cần phải tạo một hình ảnh hoàn toàn mới và hợp nhất hai hình ảnh đó không, hoặc có cách nào để tạo hình ảnh mà tôi đã tạo ra ($newImage) không? Cảm ơn trước, tất cả các hướng dẫn Tôi đã tìm thấy đã dẫn tôi hư không, và là người duy nhất được áp dụng tôi tìm thấy trên SO là cho android :(

Trả lời

13
  1. Mở ảnh gốc
  2. Tạo một hình ảnh trống mới.
  3. Điền hình ảnh mới với màu nền muốn của bạn
  4. Sử dụng imagecopyresampled để thay đổi kích thước & sao chép các hình ảnh ban đầu trung vào hình ảnh mới
  5. Lưu hình ảnh mới
.210

Thay vì câu lệnh switch của bạn, bạn cũng có thể sử dụng

$img = imagecreatefromstring(file_get_contents ("path/to/image")); 

này sẽ tự động phát hiện các loại hình ảnh (nếu imagetype được hỗ trợ bởi bạn cài đặt)

cập nhật với mẫu mã

$orig_filename = 'c:\temp\380x253.jpg'; 
$new_filename = 'c:\temp\test.jpg'; 

list($orig_w, $orig_h) = getimagesize($orig_filename); 

$orig_img = imagecreatefromstring(file_get_contents($orig_filename)); 

$output_w = 200; 
$output_h = 200; 

// determine scale based on the longest edge 
if ($orig_h > $orig_w) { 
    $scale = $output_h/$orig_h; 
} else { 
    $scale = $output_w/$orig_w; 
} 

    // calc new image dimensions 
$new_w = $orig_w * $scale; 
$new_h = $orig_h * $scale; 

echo "Scale: $scale<br />"; 
echo "New W: $new_w<br />"; 
echo "New H: $new_h<br />"; 

// determine offset coords so that new image is centered 
$offest_x = ($output_w - $new_w)/2; 
$offest_y = ($output_h - $new_h)/2; 

    // create new image and fill with background colour 
$new_img = imagecreatetruecolor($output_w, $output_h); 
$bgcolor = imagecolorallocate($new_img, 255, 0, 0); // red 
imagefill($new_img, 0, 0, $bgcolor); // fill background colour 

    // copy and resize original image into center of new image 
imagecopyresampled($new_img, $orig_img, $offest_x, $offest_y, 0, 0, $new_w, $new_h, $orig_w, $orig_h); 

    //save it 
imagejpeg($new_img, $new_filename, 80); 
+0

thông tin chi tiết về tuyên bố chuyển đổi rất tuyệt, điều đó chắc chắn hiệu quả hơn tuyên bố chuyển đổi của tôi. Tôi đang bối rối về imagecopyresampled mặc dù. Việc thay đổi kích thước của hình ảnh gốc hoàn tất và hoạt động, nó chỉ dán nó lên nền 200x200 px. Sự hiểu biết của tôi là imagecopyresampled sẽ thay đổi kích thước hình ảnh ban đầu một lần nữa? – MaurerPower

+0

xem câu trả lời cập nhật – bumperbox

+0

Điều đó hiệu quả! Tôi đã kết thúc bằng cách sử dụng một chút của một phiên bản sửa đổi để có được kết quả chính xác tôi muốn, nhưng điều này đã cho tôi chắc chắn trên con đường bên phải! Cảm ơn bumberbox! Được chấp nhận và upvoted! – MaurerPower

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