2012-05-14 18 views
10

He encontrado algunas cosas en la web sobre PHP + GD con respecto a la manipulación de imágenes, pero ninguna parece darme lo que estoy buscando.php GD agregar relleno a la imagen

Tengo que subir una imagen de cualquier tamaño, el script que he escrito cambia el tamaño de la imagen a no más de 200px de ancho por 200px de alto manteniendo la relación de aspecto. Así que la imagen final podría ser de 150px por 200px, por ejemplo. Lo que quiero hacer es manipular la imagen más adelante y agregar una estera alrededor de la imagen para rellenarla a 200px por 200px sin afectar la imagen original. Por ejemplo:

Unpadded Image 143x200

Padded image 200x200

El código que tiene que conseguir la imagen redimensionada es aquí, he intentado un par de cosas, pero definitivamente estoy teniendo una edición implementar el proceso secundario de añadir el relleno .

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

Pienso que necesito utilizar imagecopy() justo después de la llamada imagecopyresampled(). De esta manera, la imagen ya es del tamaño que quiero, solo necesito crear una imagen exactamente 200 x 200 y pegar $ newImage en el centro (vert y horiz) de eso. ¿Necesito crear una imagen completamente nueva y fusionar las dos, o hay una manera de simplemente rellenar la imagen que ya he creado ($newImage)? Gracias de antemano, todos los tutoriales que he encontrado me han llevado a ninguna parte, y la única aplicable he encontrado en SO era para android :(

Respuesta

13
  1. Abra la imagen original
  2. crear una nueva imagen en blanco.
  3. Llene la nueva imagen con el color de fondo de su falta
  4. uso imagecopyresampled para cambiar el tamaño & copiar la imagen original centrada en la nueva imagen
  5. Guardar la nueva imagen

En lugar de su sentencia switch también se puede utilizar

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

Esta automático detectará el tipo de imagen (si el imagetype la facilita su instalación)

Actualizado con código de ejemplo

$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

la idea de la declaración de cambio fue excelente, definitivamente es más eficiente que mi declaración de cambio. Sin embargo, estoy confundido acerca de la imagencopia revisada. El cambio de tamaño de la imagen original está completo y funcionando, solo se pega sobre un fondo de 200x200 px. Según entiendo, ¿la imagen copiada a escala cambiará el tamaño de la imagen original otra vez? – MaurerPower

+0

ver respuesta actualizada – bumperbox

+0

¡Eso funcionó muy bien! Terminé usando un poco de una versión modificada para obtener los resultados exactos que quería, ¡pero esto me llevó definitivamente al buen camino! Gracias bumberbox! ¡Aceptado y votado! – MaurerPower

Cuestiones relacionadas