Entradas con la etiqueta ‘redimensionar imagenes desde php’

script redimensionar imagenes gif’s y png’s transparentes

Viernes, 29 de Agosto de 2008

Este post es la continuación de redimensionar imagens gif y png transparentes

Ahora un ejemplo completo donde tenemos una función que nos pasan el string de una imagen y devolvemos ese string redimensionado. Esta preparado para utilizarse al recoger la información de un formulario con imagenes. Del Array $_FILES[] obtendremos el string de la imagen tal que así

PHP:
  1. $stringConLaFoto=file_get_contents($_FILES[$nombre_Foto_Formulario]['tmp_name']);
  2.  
  3. $extensión=$_FILES[$nombre_Foto_Formulario]['type'];
  4.  
  5. $ancho=150;
  6.  
  7. //ahora llamamos a la funcion de redimensionar
  8.  
  9. $imagen_redimensionada=redimensionarImatge($stringConLaFoto,$extension,$ancho)

PHP:
  1. #************************************************************************************
  2. #    redimensionaImatge:
  3. #
  4. #    Donada una imatge es redimensiona a l'amplada o alçada passades com a paràmetre.
  5. #    Si no se li passen les mesures, s'agafaran les dimensions de les variables
  6. #    globals, que es troben a l'inicialitzador, MIDA_IMATGE_AMPLADA i MIDA_IMATGE_ALCADA
  7. #
  8. #    Autor: Marc + Cristian en  controlzeta.net
  9. #    Fecha creacion: 24/04/08
  10.  
  11. #  ultima modificacion 28/08/2008
  12. #
  13. #************************************************************************************
  14.  
  15. function redimensionarImatge($imatge,$extensio,$amplada=FALSE,$alcada=FALSE) {
  16. $original = imagecreatefromstring($imatge);
  17. $mides[] = imagesx($original); // $mides[0] ANCHURA
  18. $mides[] = imagesy($original); //  $mides[1] ALTURA
  19.  
  20. //echo '<br>AMPLADA R:'.$amplada;
  21. //echo '<br>AMPLADA R:'.$alcada;
  22. //echo '<br>AMPLADA:'.$mides[0];
  23. //echo '<br>AMPLADA:'.$mides[1];
  24.  
  25. if ( !( ($mides[0]==$amplada or $amplada==FALSE) AND ($mides[1]== $alcada or $alcada==FALSE) ) ){ //comprueba Que no se redimendsione al mismo tamaño Critian 19-08-2008
  26.  
  27. if($amplada || $alcada) {
  28. $midaHoritzontal = $amplada;
  29. $midaVertical = $alcada;
  30.  
  31. if( $alcada && ($mides[0]>(2*$mides[1])) ) {
  32. unset($alcada);
  33. $midaHoritzontal = 100;
  34. } elseif(!$alcada) {
  35. $midaVertical = $mides[1];
  36. }
  37. } elseif($mides[0] <= MIDA_IMATGE_AMPLADA && $mides[1] <= MIDA_IMATGE_ALCADA) {
  38. $midaHoritzontal = $mides[0];
  39. $midaVertical = $mides[1];
  40. $noRedimensionar = true;
  41. } else {
  42. $midaHoritzontal = MIDA_IMATGE_AMPLADA;
  43. $midaVertical = MIDA_IMATGE_ALCADA;
  44. }
  45. }else{
  46. $midaHoritzontal = $mides[0];
  47. $midaVertical = $mides[1];
  48. $noRedimensionar = true;
  49. }
  50.  
  51. if(!isset($noRedimensionar)) {
  52. unset($imatge);
  53.  
  54. if($midaHoritzontal) {
  55. $ratio = ($mides[0]/$midaHoritzontal);
  56. $midaVertical = round($mides[1]/$ratio);
  57. } else {
  58. $ratio = ($mides[1]/$midaVertical);
  59. $midaHoritzontal = round($mides[0]/$ratio);
  60. }
  61.  
  62. $thumb = imagecreatetruecolor($midaHoritzontal,$midaVertical);
  63.  
  64. switch($extensio) {
  65. case 'image/pjpeg':
  66. case 'image/jpeg':
  67. imagecopyresampled($thumb,$original,0,0,0,0,$midaHoritzontal,$midaVertical,$mides[0],$mides[1]);
  68. imagejpeg($thumb,'../tempImage');
  69. break;
  70.  
  71. case 'image/gif':
  72. case 'image/png':
  73. $colorTransparancia=imagecolortransparent($original);// devuelve el color usado como transparencia o -1 si no tiene transparencias
  74. if($colorTransparancia!=-1){ //TIENE TRANSPARENCIA
  75. //unset($thumb);
  76. //$thumb = imagecreatetruecolor($midaHoritzontal,$midaVertical);
  77.  
  78. $colorTransparente = imagecolorsforindex($original, $colorTransparancia); //devuelve un array con las componentes de lso colores RGB + alpha
  79. $idColorTransparente = imagecolorallocatealpha($thumb, $colorTransparente['red'], $colorTransparente['green'], $colorTransparente['blue'], $colorTransparente['alpha']); // Asigna un color en una imagen retorna identificador de color o FALSO o -1 apartir de la version 5.1.3
  80.  
  81. imagefill($thumb, 0, 0, $idColorTransparente);// rellena de color desde una cordenada, en este caso todo rellenado del color que se definira como transparente
  82. imagecolortransparent($thumb, $idColorTransparente); //Ahora definimos que en el nueva imagen el color transparente será el que hemos pintado el fondo.
  83. imagecopyresampled($thumb,$original,0,0,0,0,$midaHoritzontal,$midaVertical,$mides[0],$mides[1]);// copia y redimensiona un trozo de imagen
  84. //imagecopyresized
  85. }
  86.  
  87. switch ($extensio){
  88. case 'image/gif':
  89. imagegif($thumb,'../tempImage');
  90. break;
  91. case 'image/png':
  92. imagepng($thumb,'../tempImage');
  93. break;
  94. }
  95.  
  96. default:
  97. imagecopyresampled($thumb,$original,0,0,0,0,$midaHoritzontal,$midaVertical,$mides[0],$mides[1]);
  98. imagejpeg($thumb,'../tempImage');
  99.  
  100. break;
  101. }
  102.  
  103. //Lliurem la memòria
  104. unset($original);
  105. unset($thumb);
  106.  
  107. if (function_exists('file_get_contents')) {
  108. $imatge = file_get_contents('../tempImage');
  109. } elseif ($file_to_insert_size = filesize('../tempImage')) {
  110. $imatge = fread(fopen('../tempImage', 'rb'), $file_to_insert_size);
  111. }
  112.  
  113. //eliminació de la imatge del servidor
  114. @unlink('../tempImage');
  115.  
  116. }
  117.  
  118. return $imatge;
  119.  
  120. }

En este escript no se tienen en cuenta la redimension de imagenes gif animadas.

Redimensionar imagenes GIF y PNG con fondo transparentes desde PHP

Jueves, 21 de Agosto de 2008

En muchos ocasiones hemos visto scripts para redimensionar imagenes que no tienen en cuenta la redimensión de imágenes con fondo transparente. Hoy vamos a realizar un script de php, una funcion capaz de redimensionar varios tipos de archivos incluidos gif y png's transparentes.

Para ello voy a explicar las funciones mas importantes que php inlcuye por defecto y que nos ayudaran a redimensionar imagenes trasparentes gif's y png's.

  • imagecolortransparent($imagen): Nos devuelve el coler transparente de una imagen o -1
  • imagecolorsforindex($imagen,$color): Dado un color y una imagen devueve las componentes del color en RGB + alpha.
  • imagecolorallocatealpha(,..,.) : devuelve el identificador de el color en una imagen
  • imagefill($imagen,$X,$Y,$color): Rellena una imagen del color que le digamos, empezando en las cordenadas dadas.
  • imagecopyresized / imagecopyresampled: Estas dos funciones tiene el mismo objetivo, copiar de una imagen original a una de tamaño menor (redimensionan la imagen), la diferencia es que imagecopysampled aplica un suavizado para no dejar tan pixeladas las imagenes escaladas. A la hora de hacer gif's transparanrtes hay quien recomienda no suavizar debido a que deforma demasiado la imagen original. Yo opino que dependiendo de tamaño al que queramos redimensionar, será mejor usar una u otra. hacer vuestras pruebas en el codigo se puede sustituir una por otra función para ver los resultados.

Aquí teneis el codigo solo que se encarga de ver si una imagen tiene un color transparente. Y si lo tiene pues aplicais la redimension. En verdad una imagen gif, para poder hacer el fondo transparente lo que hace es pintar con un color cualquiera lo que va a ser transparente y además se guarda la inforación de que color ha sido usado como transparente. Así nosotros lo que tenemos que hacer es mirar si esa imangen tiene algun color marcado como transparente. Una vez que lo tiene pintamos toda una imagen nueva con ese color, redimensionamos sobre ese fondo y marcamos en la imagen nueva el color de la transparencia. aquí e codigo php que lo hace:

PHP:
  1. $colorTransparancia=imagecolortransparent($original);// devuelve el color usado como transparencia o -1 si no tiene transparencias
  2. if($colorTransparancia!=-1){ //SI TIENE TRANSPARENCIA
  3.  
  4. $colorTransparente = imagecolorsforindex($original, $colorTransparancia); //devuelve un array con las componentes de los colores RGB + alpha
  5. $idColorTransparente = imagecolorallocatealpha($thumb, $colorTransparente['red'], $colorTransparente['green'], $colorTransparente['blue'], $colorTransparente['alpha']); // Asigna un color en una imagen retorna identificador de color o FALSO o -1 apartir de la version 5.1.3
  6.  
  7. imagefill($thumb, 0, 0, $idColorTransparente);// rellena de color desde una cordenada, en este caso todo rellenado del color que se definira como transparente
  8. imagecolortransparent($thumb, $idColorTransparente); //Ahora definimos que en el nueva imagen el color transparente será el que hemos pintado el fondo.
  9. imagecopyresampled($thumb,$original,0,0,0,0,$midaHoritzontal,$midaVertical,$mides[0],$mides[1]);// copia y redimensiona un trozo de imagen
  10. //imagecopyresized
  11.  
  12. }

Ahora unas imagens de prueba para que se vean los resultados obtenidos y mas abajo un ejemplo completo de código. con distintas medidas y diferencias entre las funciones imagercopyresized y imagecopyresampled

imagen PNG transparente original:

imagen transparente png original

imagen transparente png original

imagen PNG transparente redimensionada a 50 px de alto con la funcion imagecopyresampled:

imagen png transparente redimensionada con imagecopyresampled

imagen png transparente redimensionada con imagecopyresampled

imagen PNG transparente redimensionada por anchuca a 50 px de alto con la funcion imagecopyresized:

imagen png transparente redimensionada con  imagecopyresized

imagen png transparente redimensionada con imagecopyresized

Ahora las mismas imagenes redimensionadas por anchura a 150px :

imagen png transparente redimensionada con imagecopyresized:

imagen png transparente redimensionada con imagecopyresized

imagen png transparente redimensionada con imagecopyresized

imagen png transparente redimensionada con imagecopyresampled

imangen png transparente redimensioanda con imagecopyresampled

imangen png transparente redimensioanda con imagecopyresampled

Ahora el mismo ejemplo pero redimensinando imagenes gif:

imagen gif original

imagen transparente png original

gif transparente redimensionada a 50 pixeles de ancho con imagecopyresampled:

imagen transparente gif redimensionada con imagecopyresampled

imagen gif transparente redimensionada a 50 pixeles de ancho con imagecopyresized:

imagen transparente gif redimensionada con imagecopyresized

imagen gif transparente redimensionada a 150 pixeles de ancho con imagecopyresampled

imagen transparente gif redimensionada a 150'x con imagecopyresampled

imagen gif transparente redimensionada a 150 pixeles de ancho con imagecopyresized

imagen transparente gif redimensionada a 150px  con imagecopyresized

Ahora se aprecia mejor la difernecia entra las dos funciones para redimensionar las imagenes, fijaros cmo se nota el suavizado en la penultima imagen, respecto a la ultima, si os fijais la "X" se nota pixelada y usando la funcion que suaviza queda algo mejor. Como veis depende del tamaño y de las imagenes a redimensionar, pero yo me quedo en los casos para que lo uso con imagecopyresampled!

Para ver el ejemplo completo de redimension de imagenes ir al post:

ejemplo de código php completo de redimension de imanges transparentes