PHP
Procesamiento de imágenes con GD
Buscar..
Observaciones
Cuando se usa el header("Content-Type: $mimeType");
e image____
para generar solo una imagen a la salida, asegúrese de no mostrar nada más, observe incluso una línea en blanco después de ?>
. (Eso puede ser un 'error' difícil de rastrear: no se obtiene ninguna imagen ni idea de por qué). El consejo general es no incluir?> En absoluto aquí.
Creando una imagen
Para crear una imagen en blanco, use la función imagecreatetruecolor
:
$img = imagecreatetruecolor($width, $height);
$img
ahora es una variable de recurso para un recurso de imagen con $width
x $height
píxeles. Tenga en cuenta que el ancho cuenta de izquierda a derecha y el alto cuenta de arriba a abajo.
Los recursos de imágenes también se pueden crear a partir de funciones de creación de imágenes , como:
-
imagecreatefrompng
-
imagecreatefromjpeg
- Otras funciones de
imagecreatefrom*
.
Los recursos de imagen pueden liberarse más adelante cuando no haya más referencias a ellos. Sin embargo, liberar la memoria inmediatamente (esto puede ser importante si está procesando muchas imágenes grandes), usar imagedestroy()
en una imagen cuando ya no se usa puede ser una buena práctica.
imagedestroy($image);
Convertir una imagen
Las imágenes creadas por la conversión de imagen no modifican la imagen hasta que la imprime. Por lo tanto, un convertidor de imágenes puede ser tan simple como tres líneas de código:
function convertJpegToPng(string $filename, string $outputFile) {
$im = imagecreatefromjpeg($filename);
imagepng($im, $outputFile);
imagedestroy($im);
}
Salida de imagen
Se puede crear una image*
usando las funciones de image*
, donde *
es el formato de archivo.
Tienen esta sintaxis en común:
bool image___(resource $im [, mixed $to [ other parameters]] )
Guardando en un archivo
Si desea guardar la imagen en un archivo, puede pasar el nombre del archivo, o una secuencia de archivos abierta, como $to
. Si pasa un flujo, no necesita cerrarlo, porque GD lo cerrará automáticamente.
Por ejemplo, para guardar un archivo PNG:
imagepng($image, "/path/to/target/file.png");
$stream = fopen("phar://path/to/target.phar/file.png", "wb");
imagepng($image2, $stream);
// Don't fclose($stream)
Cuando use fopen
, asegúrese de usar la bandera b
lugar de la bandera t
, porque el archivo es una salida binaria.
No tratan de pasar fopen("php://temp", $f)
o fopen("php://memory", $f)
a la misma. Dado que la función es cerrada por la función después de la llamada, no podrá utilizarla más, como para recuperar su contenido.
Salida como una respuesta HTTP
Si desea devolver directamente esta imagen como respuesta de la imagen (por ejemplo, para crear credenciales dinámicas), no necesita pasar nada (o pasar null
) como segundo argumento. Sin embargo, en la respuesta HTTP, debe especificar su tipo de contenido:
header("Content-Type: $mimeType");
$mimeType
es el tipo MIME del formato que está devolviendo. Los ejemplos incluyen image/png
, image/gif
e image/jpeg
.
Escribir en una variable
Hay dos formas de escribir en una variable.
Utilizando OB (buffer de salida)
ob_start();
imagepng($image, null, $quality); // pass null to supposedly write to stdout
$binary = ob_get_clean();
Usando envoltorios de flujo
Puede tener muchas razones por las que no desea utilizar el búfer de salida. Por ejemplo, es posible que ya tenga OB en. Por lo tanto, se necesita una alternativa.
Usando la función stream_wrapper_register
, se puede registrar una nueva envoltura de flujo. Por lo tanto, puede pasar una secuencia a la función de salida de imagen y recuperarla más tarde.
<?php
class GlobalStream{
private $var;
public function stream_open(string $path){
$this->var =& $GLOBALS[parse_url($path)["host"]];
return true;
}
public function stream_write(string $data){
$this->var .= $data;
return strlen($data);
}
}
stream_wrapper_register("global", GlobalStream::class);
$image = imagecreatetruecolor(100, 100);
imagefill($image, 0, 0, imagecolorallocate($image, 0, 0, 0));
$stream = fopen("global://myImage", "");
imagepng($image, $stream);
echo base64_encode($myImage);
En este ejemplo, la clase GlobalStream
escribe cualquier entrada en la variable de referencia (es decir, escribe indirectamente en la variable global del nombre dado). La variable global se puede recuperar más tarde directamente.
Hay algunas cosas especiales a tener en cuenta:
- Una clase de derivador de flujo totalmente implementada debería tener este aspecto, pero de acuerdo con las pruebas realizadas con el método mágico
__call
, solo se llama astream_open
,stream_write
ystream_close
desde funciones internas. - No se requieren indicadores en la llamada
fopen
, pero al menos debe pasar una cadena vacía. Esto se debe a que la funciónfopen
espera ese parámetro, e incluso si no lo usa en su implementación destream_open
, todavía se necesita uno falso. - Según las pruebas,
stream_write
se llama varias veces. Recuerde usar.=
(Asignación de concatenación), no=
(asignación de variable directa).
Ejemplo de uso
En la etiqueta HTML <img>
, se puede proporcionar una imagen directamente en lugar de usar un enlace externo:
echo '<img src="data:image/png;base64,' . base64_encode($binary) . '">';
Recorte de imagen y cambio de tamaño
Si tiene una imagen y desea crear una nueva, con nuevas dimensiones, puede usar la función imagecopyresampled
:
Primero crea una nueva image
con las dimensiones deseadas:
// new image
$dst_img = imagecreatetruecolor($width, $height);
y almacenar la imagen original en una variable. Para hacerlo, puede usar una de las funciones createimagefrom*
donde * significa:
- jpeg
- gif
- png
- cuerda
Por ejemplo:
//original image
$src_img=imagecreatefromstring(file_get_contents($original_image_path));
Ahora, copie toda (o parte de) la imagen original (src_img) en la nueva imagen (dst_img) por imagecopyresampled
:
imagecopyresampled($dst_img, $src_img,
$dst_x ,$dst_y, $src_x, $src_y,
$dst_width, $dst_height, $src_width, $src_height);
Para establecer las src_*
y dst_*
, use la siguiente imagen:
Ahora, si desea copiar toda la imagen de origen (inicial), en toda el área de destino (sin recorte):
$src_x = $src_y = $dst_x = $dst_y = 0;
$dst_width = $width;// width of new image
$dst_height = $height; //height of new image
$src_width = imagesx($src_img); //width of initial image
$src_height = imagesy($src_img); //height of initial image