Pregunta

Quiero permitir a los usuarios cargar imágenes tipo avatar en una variedad de formatos (GIF, JPEG y PNG al menos), pero para salvarlos a todos como BLOB de base de datos PNG.Si las imágenes están sobredimensionadas, en píxeles, quiero cambiar su tamaño antes de insertar la base de datos.

¿Cuál es la mejor manera de utilizar GD para cambiar el tamaño y convertir PNG?

Editar:Lamentablemente, sólo Dios está disponible en el servidor que necesito usar, no ImagenMagia.

¿Fue útil?

Solución

<?php                                              
/*
Resizes an image and converts it to PNG returning the PNG data as a string
*/
function imageToPng($srcFile, $maxSize = 100) {  
    list($width_orig, $height_orig, $type) = getimagesize($srcFile);        

    // Get the aspect ratio
    $ratio_orig = $width_orig / $height_orig;

    $width  = $maxSize; 
    $height = $maxSize;

    // resize to height (orig is portrait) 
    if ($ratio_orig < 1) {
        $width = $height * $ratio_orig;
    } 
    // resize to width (orig is landscape)
    else {
        $height = $width / $ratio_orig;
    }

    // Temporarily increase the memory limit to allow for larger images
    ini_set('memory_limit', '32M'); 

    switch ($type) 
    {
        case IMAGETYPE_GIF: 
            $image = imagecreatefromgif($srcFile); 
            break;   
        case IMAGETYPE_JPEG:  
            $image = imagecreatefromjpeg($srcFile); 
            break;   
        case IMAGETYPE_PNG:  
            $image = imagecreatefrompng($srcFile);
            break; 
        default:
            throw new Exception('Unrecognized image type ' . $type);
    }

    // create a new blank image
    $newImage = imagecreatetruecolor($width, $height);

    // Copy the old image to the new image
    imagecopyresampled($newImage, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);

    // Output to a temp file
    $destFile = tempnam();
    imagepng($newImage, $destFile);  

    // Free memory                           
    imagedestroy($newImage);

    if ( is_file($destFile) ) {
        $f = fopen($destFile, 'rb');   
        $data = fread($f);       
        fclose($f);

        // Remove the tempfile
        unlink($destFile);    
        return $data;
    }

    throw new Exception('Image conversion failed.');
}

Otros consejos

Los pasos de su proceso deberían verse así:

  1. Verificar el Tipo de archivo
  2. Cargue la imagen si es un tipo de archivo compatible en GD usando crear imagen desde*
  3. Cambiar el tamaño usando tamaño de copia de imagen o imagencopiaresampleada
  4. Guarde la imagen usando imagepng($manejar, 'nombre de archivo.png', $calidad, $filtros)

ImageMagick es más rápido, genera mejores imágenes, es más configurable y, finalmente, (en mi opinión) es mucho más fácil de codificar.

@ceejayoz Solo espera el nuevo GD: es programación orientada a objetos como MySQLi y en realidad no está mal :)

Si desea utilizar gdlib, utilice gdlib 2 o superior.Tiene una función llamada imagecopyresampled(), que interpolará píxeles mientras cambia el tamaño y se verá mucho mejor.

Además, siempre he escuchado en la red que almacenar imágenes en la base de datos es de mala educación:

  • Es más lento de acceder que el disco.
  • Su servidor deberá ejecutar un script para llegar a la imagen en lugar de simplemente servir un archivo
  • Su script ahora es responsable de muchas cosas que el servidor web solía manejar:
    • Configurar el encabezado de tipo de contenido adecuado
    • Configurar los encabezados de almacenamiento en caché/tiempo de espera/etiqueta electrónica adecuados, para que los clientes puedan almacenar en caché la imagen correctamente.Si no hace esto correctamente, el script de servicio de imágenes se ejecutará en cada solicitud, lo que aumentará aún más la carga en el servidor.

La única ventaja que puedo ver es que no es necesario mantener sincronizados la base de datos y los archivos de imagen.Aunque todavía lo recomendaría en contra.

¿Estás seguro de que no tienes ImageMagick en el servidor?

Te invito a que uses PHP (la pregunta está etiquetada con PHP).La empresa de hosting que uso no tiene ninguna extensión ImageMagick activada según phpinfo().

Pero cuando les pregunté acerca de ellos dijeron aquí está la lista de programas ImageMagick disponibles desde código PHP.Así de simple: no hay una interfaz de mensajería instantánea en PHP, pero puedo llamar a programas de mensajería instantánea directamente desde PHP.

Espero que tengas la misma opción.

Y yo fuertemente De acuerdo: almacenar imágenes en una base de datos no es una buena idea.

Algo como esto, tal vez:


<?php
   //Input file
   $file = "myImage.png";
   $img = ImageCreateFromPNG($file);

   //Dimensions
   $width = imagesx($img);
   $height = imagesy($img);
   $max_width = 300;
   $max_height = 300;
   $percentage = 1;

   //Image scaling calculations
   if ( $width > $max_width ) { 
      $percentage = ($height / ($width / $max_width)) > $max_height ?
           $height / $max_height :
           $width / $max_width;
   }
   elseif ( $height > $max_height) {
      $percentage = ($width / ($height / $max_height)) > $max_width ? 
           $width / $max_width :
           $height / $max_height;
   }
   $new_width = $width / $percentage;
   $new_height = $height / $percentage;

   //scaled image
   $out = imagecreatetruecolor($new_width, $new_height);
   imagecopyresampled($out, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

   //output image
   imagepng($out);
?>

No he probado el código, por lo que puede haber algunos errores de sintaxis; sin embargo, debería brindarle una presentación justa de cómo se puede hacer.Además, asumí un archivo PNG.Es posible que desee tener algún tipo de declaración de cambio para determinar el tipo de archivo.

Este artículo Parece que se ajustaría a lo que quieres.Deberá cambiar la función de guardar imagejpeg() a imagepng() y hacer que guarde el archivo en una cadena en lugar de enviarlo a la página, pero aparte de eso, debería ser fácil copiar y pegar en su código existente.

¿Es absolutamente necesaria la GD? ImagenMagia es más rápido, genera mejores imágenes, es más configurable y, finalmente, (en mi opinión) es mucho más fácil de codificar.

Creo esta página es un buen punto de partida.Utiliza imagecreatefrom(jpeg/gif/png) y cambia el tamaño y convierte la imagen y luego la envía al navegador.En lugar de generar el navegador, puede generar un BLOB en una base de datos sin muchos minutos de reescritura de código.

phppulgar es una abstracción de alto nivel que puede valer la pena examinar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top