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 a stream_open , stream_write y stream_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ón fopen espera ese parámetro, e incluso si no lo usa en su implementación de stream_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:

introduzca la descripción de la imagen aquí

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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow