De su pregunta, parece que es un poco nuevo en GD, compartiré algunas experiencias mías, tal vez esto esté un poco fuera del tema, pero creo que será útil para alguien nuevo en GD como usted:
Paso 1, validar archivo. Utilice la siguiente función para comprobar si el $_FILES['image']['tmp_name']
archivo es válido:
function getContentsFromImage($image) {
if (@is_file($image) == true) {
return file_get_contents($image);
} else {
throw new \Exception('Invalid image');
}
}
$contents = getContentsFromImage($_FILES['image']['tmp_name']);
Paso 2, obtenga el formato del archivo Pruebe la siguiente función con la extensión finfo para verificar el formato del archivo (contenido). Diría que ¿por qué no lo usa $_FILES["image"]["type"]
para verificar el formato de archivo? Debido a que SOLO verifica la extensión del archivo, no el contenido del archivo, si alguien cambia el nombre de un archivo originalmente llamado world.png a world.jpg , $_FILES["image"]["type"]
devolverá jpeg no png, por lo que $_FILES["image"]["type"]
puede devolver un resultado incorrecto.
function getFormatFromContents($contents) {
$finfo = new \finfo();
$mimetype = $finfo->buffer($contents, FILEINFO_MIME_TYPE);
switch ($mimetype) {
case 'image/jpeg':
return 'jpeg';
break;
case 'image/png':
return 'png';
break;
case 'image/gif':
return 'gif';
break;
default:
throw new \Exception('Unknown or unsupported image format');
}
}
$format = getFormatFromContents($contents);
Paso 3, Obtener recurso GD Obtener recurso GD de los contenidos que tenemos antes:
function getGDResourceFromContents($contents) {
$resource = @imagecreatefromstring($contents);
if ($resource == false) {
throw new \Exception('Cannot process image');
}
return $resource;
}
$resource = getGDResourceFromContents($contents);
Paso 4, obtenga la dimensión de la imagen Ahora puede obtener la dimensión de la imagen con el siguiente código simple:
$width = imagesx($resource);
$height = imagesy($resource);
Ahora, veamos qué variable obtuvimos de la imagen original entonces:
$contents, $format, $resource, $width, $height
OK, lets move on
Paso 5, calcule los argumentos de la imagen redimensionada Este paso está relacionado con su pregunta, el propósito de la siguiente función es obtener argumentos redimensionados para la función GD imagecopyresampled()
, el código es un poco largo, pero funciona muy bien, incluso tiene tres opciones: estirar, encoger y llenar.
stretch : la dimensión de la imagen de salida es la misma que la nueva dimensión que estableciste. No mantendrá la relación altura / ancho.
encogimiento : la dimensión de la imagen de salida no excederá la nueva dimensión que proporcione y mantendrá la relación altura / ancho de la imagen.
Relleno : la dimensión de la imagen de salida será la misma que la nueva dimensión que proporcione, recortará y cambiará el tamaño de la imagen si es necesario, y mantendrá la relación altura / ancho de la imagen. Esta opción es lo que necesita en su pregunta.
function getResizeArgs($width, $height, $newwidth, $newheight, $option) {
if ($option === 'stretch') {
if ($width === $newwidth && $height === $newheight) {
return false;
}
$dst_w = $newwidth;
$dst_h = $newheight;
$src_w = $width;
$src_h = $height;
$src_x = 0;
$src_y = 0;
} else if ($option === 'shrink') {
if ($width <= $newwidth && $height <= $newheight) {
return false;
} else if ($width / $height >= $newwidth / $newheight) {
$dst_w = $newwidth;
$dst_h = (int) round(($newwidth * $height) / $width);
} else {
$dst_w = (int) round(($newheight * $width) / $height);
$dst_h = $newheight;
}
$src_x = 0;
$src_y = 0;
$src_w = $width;
$src_h = $height;
} else if ($option === 'fill') {
if ($width === $newwidth && $height === $newheight) {
return false;
}
if ($width / $height >= $newwidth / $newheight) {
$src_w = (int) round(($newwidth * $height) / $newheight);
$src_h = $height;
$src_x = (int) round(($width - $src_w) / 2);
$src_y = 0;
} else {
$src_w = $width;
$src_h = (int) round(($width * $newheight) / $newwidth);
$src_x = 0;
$src_y = (int) round(($height - $src_h) / 2);
}
$dst_w = $newwidth;
$dst_h = $newheight;
}
if ($src_w < 1 || $src_h < 1) {
throw new \Exception('Image width or height is too small');
}
return array(
'dst_x' => 0,
'dst_y' => 0,
'src_x' => $src_x,
'src_y' => $src_y,
'dst_w' => $dst_w,
'dst_h' => $dst_h,
'src_w' => $src_w,
'src_h' => $src_h
);
}
$args = getResizeArgs($width, $height, 150, 170, 'fill');
Paso 6, tamaño de imagen Uso $args
, $width
, $height
, $format
y $ recursos llegamos desde arriba en la siguiente función y obtener el nuevo recurso de la imagen redimensionada:
function runResize($width, $height, $format, $resource, $args) {
if ($args === false) {
return;
}
$newimage = imagecreatetruecolor($args['dst_w'], $args['dst_h']);
if ($format === 'png') {
imagealphablending($newimage, false);
imagesavealpha($newimage, true);
$transparentindex = imagecolorallocatealpha($newimage, 255, 255, 255, 127);
imagefill($newimage, 0, 0, $transparentindex);
} else if ($format === 'gif') {
$transparentindex = imagecolorallocatealpha($newimage, 255, 255, 255, 127);
imagefill($newimage, 0, 0, $transparentindex);
imagecolortransparent($newimage, $transparentindex);
}
imagecopyresampled($newimage, $resource, $args['dst_x'], $args['dst_y'], $args['src_x'], $args['src_y'], $args['dst_w'], $args['dst_h'], $args['src_w'], $args['src_h']);
imagedestroy($resource);
return $newimage;
}
$newresource = runResize($width, $height, $format, $resource, $args);
Paso 7, obtenga nuevos contenidos , use la siguiente función para obtener contenidos del nuevo recurso GD:
function getContentsFromGDResource($resource, $format) {
ob_start();
switch ($format) {
case 'gif':
imagegif($resource);
break;
case 'jpeg':
imagejpeg($resource, NULL, 100);
break;
case 'png':
imagepng($resource, NULL, 9);
}
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}
$newcontents = getContentsFromGDResource($newresource, $format);
Paso 8 obtenga la extensión , use la siguiente función para obtener la extensión del formato de imagen (nota, el formato de imagen no es igual a la extensión de imagen):
function getExtensionFromFormat($format) {
switch ($format) {
case 'gif':
return 'gif';
break;
case 'jpeg':
return 'jpg';
break;
case 'png':
return 'png';
}
}
$extension = getExtensionFromFormat($format);
Paso 9 guardar imagen Si tenemos un usuario llamado mike, puede hacer lo siguiente, se guardará en la misma carpeta que este script php:
$user_name = 'mike';
$filename = $user_name . '.' . $extension;
file_put_contents($filename, $newcontents);
Paso 10 destruya el recurso ¡No olvide destruir el recurso GD!
imagedestroy($newresource);
o puede escribir todo su código en una clase y simplemente usar lo siguiente:
public function __destruct() {
@imagedestroy($this->resource);
}
CONSEJOS
Recomiendo no convertir el formato de archivo que carga el usuario, encontrará muchos problemas.