Además de mi alegría por la publicación, vaya desde aquí mi agradecimiento por su publicación.
Este blog está dedicado a la recolección de información relacionada con las nuevas tecnologías ( tecnoloxía xa), especialmente, con las vinculadas a la informática. La idea es centralizar y compartir la información y cada manual o tutorial que voy recolectando para las clases tanto de administración de sistemas como de explotación de sistemas informáticos de modo que estén disponibles para alumnos y resto de interesados. (IES A Carballeira, Ourense)
sábado, 28 de febrero de 2009
Reseña publicada en el Ciberpaís
Además de mi alegría por la publicación, vaya desde aquí mi agradecimiento por su publicación.
Traductor Gallego Castellano y viceversa
Ayer me preguntaban por un buen traductor galego/castelán o castellano/gallego; la verdad es que a pesar de hacer bastante uso de ellos -tenéis un ejemplo en el icono que traduce esta página al gallego- no había creado ningún artículo sobre el tema, con lo que cada vez que me vuelven a preguntar sobre el tema -como ayer- tengo que recurrir de nuevo a google para buscar las páginas que más me gustan.
Como podéis ver en el título, el traductor que me pidieron ayer es el de castellano a gallego. Supongo que a muchos bilingües como yo, les sucede que suelen emplear prioritariamente una lengua, en la que nos sentimos más cómodos y metemos menos veces la pata. La consecuencia de sólo hablar y leer textos en el otro idioma es que a la hora de escribirlo tenemos bastantes problemas para hacerlo de acuerdo con la normativa vigente. Una solución para ello son los traductores automáticos.
En este caso os detallo los traductores gratuitos y online que empleo habitualmente yo y para qué:
- Traductor gallego/castellano y castellano/gallego del Seminario de Lingüística Informática de la universidad de Vigo: http://sli.uvigo.es/tradutor/ basado en opentrad apertium. Es el que empleo habitualmente para traducir textos al gallego y portugués. Permite subir textos en formato html o rtf.
- Vocabulario ortográfico da lingua galega:
Real Academia Galega diccionario de la Real Academia de la Lengua Gallega incluye además sinónimos para las palabras buscadas.
- Traductor castellano/catalán: http://www.opentrad.com/ al igual que el anterior basado en la tecnología opentrad apertium, también tiene la posibilidad de traducir textos al gallego ( de hecho es el que empleo en mi página para la traducción automática al gallego que podéis ver en el icono de la bander gallega). Las diferencias con respecto al anterior se reducen a los diccionarios que emplean cada una, ya que también permite subir textos html y rtf.
- Traductor multilingüe: http://www.google.es/language_tools?hl=es si necesitáis un traductor desde/hacia casi cualquier lengua (incluídas las nacionales: gallego, euskera, catalán), desde luego esta es una opción muy cómoda ya que incluye una gran cantidad de idiomas empleados por todo el mundo.
jueves, 26 de febrero de 2009
Nubes de Palabras
La de la imagen ha sido creada desde la página http://www.wordle.net/ que os permite, a partir de un texto que se debe teclear o copiar en un cuadro de texto, o de la dirección de una página web, crear una nube de textos, permitiéndonos modificar tipos de letra colores, orientaciones dominantes de las palabras,....
Al finalizar podremos generar un pdf de la imagen o salvarlo en la propia página del proyecto, en cuyo caso os dará unos enlaces que podréis pegar en vuestra página para crear un efecto como este:
*Un bico para la que me pasó la página.
miércoles, 25 de febrero de 2009
Marvell's SheevaPlug
Bajo esta perspectiva algunas compañías comienzan a apostar por lo que dominan "plug computers" , algo así como equipos conectables. Básicamente ordenadores pequeños y potentes que se conectan a la red empleando redes Ethernet Gigabit. Este tipo de dispositivos eliminan la necesidad de tener un PC siempre encendido (con su consumo energético) en un nuestro hogar para tener acceso a este tipo de servicios. Además proporcionan un considerable ahorro de energía, el dispositivo de la imagen consume 5W frente a los entre, al menos, 25 y 100W de cualquier servidor para hogares.
Enlaces:
Información del fabricante: http://www.marvell.com/featured/plugcomputing.jsp
engadget: http://www.engadget.com/2009/02/24/marvells-sheevaplug-linux-pc-fits-in-its-power-adapter/
Manual de PHP 56. Superponer, rotar y dar transparencia a imágenes
Colores transparentes
ImageColorAllocateAlpha()
que debe contener dentro del paréntesis los siguientes parámetros (separados por comas):
$im que es el identificador de la imagen que ha sido creada previamente.
R,G,B que son valores numéricos (o variables) que contienen -en una escala de 0 a 255- los la intensidad luminosa de cada uno de los tres colores primarios (rojo, verde y azul).
trans es un valor numérico (comprendido entre 0 y 127) que indica el grado de transparencia de la tinta. El valor 0 indica opacidad total, mientras que 127 establece la transparencia total de ese color.
En el ejemplo que tienes a continuación hemos incluido dos escalas de transparencias superpuestas a intervalos del 10% (desde 0 hasta 100%) transformados a la escala 0-127.
El orden de superposición –similar a las capas de otros programas gráficos– se corresponde con el orden de las instrucciones de creación. Los resultados de las últimas funciones se superponen siempre a los obtenidos como consecuencia de la ejecución de las anteriores.
Superposición de áreas transparentes <? /* Creamos una imagen en color verdadero, le aplicamos un color de fondo (para evitar el negro por defecto) y creamos un nuevo color que utilizaremos para los bordes de rectangulos posteriores*/ Header("Content-type:image/jpeg"); $im_base=imagecreatetruecolor(610,140); $fondo=imagecolorAllocate($im_base,255,255,200); $negro=imagecolorAllocate($im_base,0,0,0); imagefill($im_base,0,0,$fondo); # definimos las componentes de un nuevo color $R=255; $G=00; $B=00; /* vamos a construir una escala de transparencias de 0 a 10 que correspondería con valores de transparencia de 0% al 100%. Crearemos un bucle que dibuje rectangulos rellenos con el color definido en la variable trans que irá aplicando al color básico los diferentes grados de transparencia y le pondremos un contorno negro para encuadrarlos*/ for($i=0;$i<=10;$i++){ $trans=ImageColorAllocateAlpha($im_base,$R,$G,$B,(int)($i*127/10)); imagefilledrectangle($im_base, 10+55*$i, 20, 50+55*$i, 80, $trans); imagerectangle($im_base, 10+55*$i, 20, 50+55*$i, 80, $negro); } #creamos un nuevo color y repetimos el proceso con nuevos rectangulos #superpuestos a los anteriores y con las transparencias en sentido opuesto # es decir, de 100 a 0% $R=0; $G=0; $B=255; for($i=0;$i<=10;$i++){ $trans=ImageColorAllocateAlpha($im_base,$R,$G,$B,127-(int)($i*127/10)); imagefilledrectangle($im_base, 10+55*$i, 60, 50+55*$i, 120, $trans); imagerectangle($im_base, 10+55*$i, 60, 50+55*$i, 120, $negro); } # visualizamos el resultado imagejpeg($im_base); ImageDestroy(); ?> |
Transparencia en imágenes externas
La función imagecopymerge() requiere que se incluyan (dentro del paréntesis y separados por comas y por el orden en el que los incluimos) los siguientes parámetros:
$destino que es el identificador de la imagen sobre la que se va a colocar la transparencia. Como es lógico, deberá haber sido creada antes de incluir la función.
$origen es el identificador de la imagen que pretendemos incluir con un determinado grado de transparencia.
Xd e Yd son las coordenadas de un punto situado en la esquina superior izquierda de la imagen destino a partir del que queremos que se impresione la nueva imagen. Si queremos una imagen a sangre pondremos 0,0 y, si quieres dejar márgenes, habrá que poner los anchos de esos márgenes (izquierdo y superior) respectivamente.
Xf e Yf nos servirán para reencuadrar la foto original recortando por la izquiera y por arriba, respectivamente, los anchos que se indiquen aquí en pixels.
Dx e Dy indican el ancho y el alto (por este orden) que va a tener la mancha de imagen en el positivo. Ten en cuenta que no puedes salirte del papel así que esos valores sumados con los márgenes (izquierdo y superior) no podrán ser mayores que las dimensiones que has elegido para la imagen destino
opacidad es el último de los parámetros de la función al que puede asignársele un valor comprendido entre 0 y 100.
Representa el porcentaje de opacidad de la imagen superpuesta. Con un valor 100 sería totalmente opaca y con 0 la transparencia sería total.
La función imagecopy
imagecopy($d,$o,$x,$y,$X,$Y,$A,$H) donde:
$d el identificador de la imagen destino, $o el identificador de la imagen original, $x y $y las coordenadas donde se posicionará –en la imagen destino– la esquina superior izquierda de la porción copiada.
$X y $Y son los anchos de los recortes izquierdo y superior de la imagen a copiar y $A y $H el ancho y el alto del área de imagen que pretendemos copiar.
Rotación de imágenes
imagerotate($im,ang,$fondo) es posible presentar imágenes rotadas.
El parámetro $im es el identificador de la imagen a rotar, ang es el ángulo de rotación (expresado en grados y tomado en sentido trigonométrico) y $fondo es un color de fondo asociado a la imagen a rotar que puede ser definido mediante la función imagecolorallocate u otra función que permita asociar colores a imágenes.
Transparencia en la rotación de imágenes
Otra de las alternativas probadas fué tratar de usar imagecolortransparent en el color de fondo de rotación de la imagen. Es evidente que ese grado de transparencia solo lo lograríamos con un formato png ó jpg. Pero... no funciona.
La alternativa siguiente fué tratar de crear una imagen con fondo transparente e insertar en ella la imagen rotada asignándole transparencia a la capa que contiene la imagen rotada. Ahí nos encontramos con algunas dificultades.
La primera de ellas es que fondo transparente sólo lo permiten las imágenes que son creadas mediante la función imagecreate. Si se crean mediante la función imagecreatetruecolor esa opción no funciona.
Otra diferencia entre ambas funciones tiene también relación con los colores de fondo. Mientras que en el caso de imagecreate se asigna como color de fondo el que se haya definido inmediatamente después de crear la imagen, cuando se trata de imagecreatetruecolor se asignará siempre un fondo negro y para cambiar ese color será necesario recurrir a la función imagefill.
Pero la felicidad completa parece que no existe. Al intentar explorar la primera de estas opciones hemos podido observar que el precio a pagar por la dichosa transparencia es obtener una imagen final de no demasiado buena calidad.
Mejor lo compruebas tu mismo en el ejemplo..
Transparencia en capas rotadas
Es suficiente usar la función imagecolortransparent, eso sí, aplicándola a la imagen correspondiente antes de insertarla mediante la opción copy en la imagen final.
Transparencia de imágenes externas <? # obtener la imagen $original="c:\\apache\\htdocs\\cursoPHP\\images\\aviones4.jpg"; # buscar el formato de la imagen mediante su extensión for($i=strlen($original)-1;$i>0;$i--){ if (substr($original,$i,1)=="."){ $tipo=substr($original,$i+1); break; } } # tamaño del original extraido del array devuelto por getimagesize $tamano=getimagesize($original); $orig_Ancho = $tamano[0]; $orig_Alto =$tamano[1]; # estableceremos un margen en blanco alrededor de la imagen de 10 pixels # igual por los cuatro lados $borde=10; $Ancho=$orig_Ancho+2*$borde; $Alto=$orig_Alto+2*$borde; # creamos la imagen segun el formato original switch($tipo){ case "jpg": $importada=imagecreatefromjpeg($original); break; case "png": $importada=imagecreatefrompng($original); break; case "gif": $importada=imagecreatefromgif($original); break; } Header("Content-type:image/jpeg"); # creamos una imagen nueva, un color de fondo y la rellenamos con él $im_base=imagecreatetruecolor($Ancho,$Alto); $fondo=imagecolorAllocate($im_base,255,255,200); imagefill($im_base,0,0,$fondo); # superponemos la imagen importada posicionandola y aplicandole # una trasmparencia de 50 imagecopymerge( $im_base, $importada, $borde, $borde , 0, 0, $orig_Ancho, $orig_Alto ,50 ); imagejpeg($im_base); ImageDestroy(); ?> Si observas los resultados obtenidos en el ejemplo en el que intentamos dar transparencia a una imagen en formato png podrás observar que deja bastante que desear y produce un efecto indeseado por el recorte de las zonas presuntamente transparentes. Esta situación nos obliga a replantear la situación para prever esta circunstancia y recurrir a un truco que parece solventar ese problema. La modificación del código fuente es la incluimos aquí debajo. Header("Content-type:image/jpeg"); $im_base=imagecreatetruecolor($Ancho,$Alto); $fondo=imagecolorAllocate($im_base,255,255,200); imagefill($im_base,0,0,$fondo); /* el truco consiste en crear una segunda imagen (im_truco)cuyas dimensiones coincidan con las de la imagen transparente que pretendemos colocar. Le asignamos como color el fondo el mismo de la imagen destino y hacemos transparente ese color en esa imagen. Después hacemos una copia de la imagen original sobre la imagen im_truco y sustituimos en la función imagecopymerge la imagen original por la obtenida mediante esta chapucilla */ $im_truco=imagecreatetruecolor($orig_Ancho, $orig_Alto); $fondo1=imagecolorAllocate($im_truco,255,0,200); imagefill($im_truco,0,0,$fondo1); imagecolortransparent ($im_truco,$fondo1); imagecopy($im_truco, $importada, 0, 0, 0, 0, $orig_Ancho, $orig_Alto); imagecopymerge( $im_base , $im_truco, $borde , $borde , 0 , 0 ,$orig_Ancho, $orig_Alto ,60 ); imagejpeg($im_base); ImageDestroy();
La función imagecolortransparent ($imagen,$color) permite hacer transparente –en la imagen indicada mediante la variable $imagen– el color señalado en la variable $color. La variable $color deberá estar definida previamente mediante la función imagecolorAllocate u alguna otra que permita identificar un color determinado.
<? # obtener la imagen $original="c:\\apache\\htdocs\\cursoPHP\\images\\aviones3.jpg"; for($i=strlen($original)-1;$i>0;$i--){ if (substr($original,$i,1)=="."){ $tipo=substr($original,$i+1); break; } } switch($tipo){ case "jpg": $importada=imagecreatefromjpeg($original); break; case "png": $importada=imagecreatefrompng($original); break; case "gif": $importada=imagecreatefromgif($original); break; } Header("Content-type:image/jpeg"); $fondo=imagecolorallocatealpha($importada,255,255,0,40); $im_base=imagerotate($importada,30,$fondo); imagejpeg($im_base); ImageDestroy(); ?>
Diferencias entre imagecreate e imagecreatetruecolor Este es el código fuente de un script que lee una imagen externa y la copia íntegra sobre otra imagen creada mediante PHP. Si visualizas el ejemplo podrás observar las diferencias entre usar la función imagecreate o utilizar imagecreatetruecolor. <? $original="c:\\apache\\htdocs\cursoPHP\\images\\aviones3.jpg"; for($i=strlen($original)-1;$i>0;$i--){ if (substr($original,$i,1)=="."){ $tipo=substr($original,$i+1); break; } } switch($tipo){ case "jpg": $importada=imagecreatefromjpeg($original); break; case "png": $importada=imagecreatefrompng($original); break; case "gif": $importada=imagecreatefromgif($original); break; } $dimensiones=getimagesize($original); $Ancho_original=$dimensiones[0]; $Alto_original=$dimensiones[1]; Header("Content-type:image/png"); $im_base=imagecreate($Ancho_original+20,$Alto_original+20); $fondo=imagecolorallocate($im_base,255,0,0); imagecolortransparent($im_base,$fondo); imagecopy($im_base,$importada,10,10,0,0,$Ancho_original,$Alto_original); imagepng($im_base); ImageDestroy(); ?>
Ejemplo resumen Aquí tienes un ejemplo en el que hemos utilizado superposiciones de imágenes, con giros, recortes y diferentes grados de transparencia. |
Manual de PHP 55. Encuadrar y redimensionar imágenes.
Lectura de imágenes externas
El problema puede surgir cuando tratemos de almacenar esas imágenes fuera del root del servidor (una forma de impedir la accesibilidad desde otras webs) y eso puede conseguirse mediante las funciones que veremos en este capítulo.
El primer paso será establecer la ruta y el nombre de la imagen. Uno de los problemas que puede presentarse es la forma de indicar dónde están la imagen a visualizar. En Windows es necesario utilizar la "\" mientras que para Linux hay que usar "/".
Al utilizar "\" en Windows puede plantearse el problema de que vaya precedida por algún caracter que pueda tener una significación especial como por ejemplo \n. Una solución para evitar esos eventuales problemas es escribir "\\" como separador de niveles de directorio. De esta forma el primer "\" indica que lo que le precede ha de interpretarse sin ninguna significación especial.
El paso siguiente será extraer el formato de la imagen. Se puede hacer leyendo la parte de la cadena comprendida entre el último punto (.) y el final de la cadena que contiene el nombre de la imagen.
Mediante el switch elijo las instrucciones para cada tipo de imagen que son similares pero con matices según del formato.
La visualización de la imagen contiene tres instrucciones: Header, imagecreatefrom e imageXXX.
En Header hay que incluir un Content - type acorde con el tipo de imagen. Puede ser, entre otros valores: image/jpeg, image/png ó image/gif según la imagen tenga formato: jpg, png ó gif.
Con idéntico criterio, la función que crea la imagen ha de ser una de estas:
$f=imagecreatefromjpeg($i)
ó
$f=imagecreatefrompng($i)
ó
$f=imagecreatefromgif($i)
siendo $i la variable que recoge el nombre y el path de la imagen original y $f la variable que contiene el resultado de la ejecución de esta función.
La función image (la que permite visualizar la nueva imagen) también puede tener una de las tres variantes que ya conocemos de ejemplos anteriores. Pueden ser:
imagejpeg($f), imagepng($f) ó imagegif($f), donde $f es la variable que recoge el resultado de la función anterior.
<? # indicar la ruta de la imagen $original="C:\\Apache\\htdocs\\cursoPHP\\images\\caballos.jpg"; # extraer el tipo de imagen según su la extension del fichero for($i=strlen($original)-1;$i>0;$i--){ if (substr($original,$i,1)=="."){ $tipo=substr($original,$i+1); break; } } # las diferentes opciones dependiendo del formato de la imagen switch($tipo){ case "jpg": Header("Content-type:image/jpeg"); $nueva=imagecreatefromjpeg($original); imagejpeg($nueva); break; case "png": Header("Content-type:image/png"); $nueva=imagecreatefrompng($original); imagepng($nueva); break; case "gif": Header("Content-type:image/gif"); $nueva=imagecreatefromgif($original); imagegif($nueva); break; } ImageDestroy(); ?>
Observa que en las imágenes en formato png se visualizan con deficiencias en los bordes de las áreas transparentes. Con el método que vemos a continuación ese problema se reduce considerablemente. |
Redimensionado de imágenes externas
El proceso es el siguiente:
1º.- Determinamos cuales son las dimensiones de la imagen externa que vamos a utilizar. Para ello, usaremos de la función:
$dim=getimagesize($r)
donde $r es la variable que contiene el path y nombre del fichero que contiene la imagen y $dim es un array escalar que contiene las dimensiones de la imagen analizada.
El elemento del array $dim[0] contiene el ancho y $dim[1] el alto, ambos expresados en pixels.
¡Cuidado...!
Esta función solo funciona cuando se trata de imágenes externas. Para determinar las dimensiones de imágenes generadas por PHP tendrás que utilizar otra distinta.
2º.- Creamos una copia de la imagen original por medio de la función imagecreate adecuada al tipo de imagen que deseamos importar. Es exactamente lo que hemos visto en el párrafo anterior.
3º.- Creamos una nueva imagen -podemos trabajar con varias imágenes, en eso no hay problema– mediante la función:
$d=imagecreatetruecolor(x,y)
dónde $d es el identificador de la imagen, y x e y son las dimensiones de esta nueva imagen.
Dado que esta imagen va a ser el soporte –una imagen en color verdadero (de ahí lo de truecolor) con fondo negro, algo muy similar al papel fotográfico que se usa en los laboratorios– sobre el que se va a impresionar esa especie de negativo que es la imagen original es necesario que sus dimensiones sean las deseadas para la imagen resultante.
4º.-Ahora toca positivar la nueva foto. Para hacerlo disponemos de la función
imagecopyresampled() que debe incluir –dentro del paréntesis– un montón de parámetros que son (por este orden):
$d que es el identificador de la imagen destino, es decir el papel fotográfico que hemos creado en el paso anterior.
$f que es el identificador de la imagen original (negativo) obtenido en el punto 2º.
Xd e Yd son las coordenadas de un punto situado en la esquina superior izquierda del papel a partir del que queremos que se impresione la fotografía. Si queremos una foto a sangre pondremos 0,0 y, si quieres dejar márgenes en blanco, habrá que poner los anchos de esos márgenes (izquierdo y superior) respectivamente.
Xf e Yf nos servirán para reencuadrar la foto original recortando por la izquierda y por arriba, respectivamente, los anchos que se indiquen aquí en pixels.
Dx e Dy indican el ancho y el alto (por este orden) que va a tener la mancha de imagen en el positivo. Ten en cuenta que no puedes salirte del papel así que esos valores sumados con los márgenes (izquierdo y superior) no podrán ser mayores que las dimensiones que has elegido para el papel fotográfico en el punto 2º.
Fx e Fy indican el ancho y el alto de la porción del original que tratamos de reproducir. Sumados con Xf e Yf no pueden exceder el tamaño del negativo.
Con estos parámetros la función ya se encarga de redimensionar la imagen (incluso distorsionarla si no hay proporcionalidad entre los anchos y altos del original y del soporte.
<? # indicar la ruta de la imagen $original="C:\\Apache\\htdocs\\cursoPHP\\images\\caballos.jpg"; for($i=strlen($original)-1;$i>0;$i--){ if (substr($original,$i,1)=="."){ $tipo=substr($original,$i+1); break; } } # dimesiones del original $tamano=getimagesize($original); $orig_Ancho = $tamano[0]; $orig_Alto =$tamano[1]; # factores de ampliación, distintos para provocar una distorsión # en la imagen resultante $ampliacion_X=2; $ampliacion_Y=1.5; # dimesiones de la imagen resultante. Vamos a dejarla a sangre # (sin márgenes en blanco) y vamos a reproducir el original # sin reencuadrar así que las esquinas superiores izquierdas de # ambas imágenes estarán en 0,0. $resultado_Ancho=$orig_Ancho*$ampliacion_X; $resultado_Alto= $orig_Alto*$ampliacion_Y; #creamos una imagen a partir de la original. Debemos elegir #la funcion adecuada al tipo de imagen original switch($tipo){ case "jpg": $importada=imagecreatefromjpeg($original); break; case "png": $importada=imagecreatefrompng($original); break; case "gif": $importada=imagecreatefromgif($original); break; } # insertamos la cabecera de la nueva imagen Header("Content-type:image/jpeg"); #creamos una imagen nueva en color verdadero $im_base=imagecreatetruecolor($resultado_Ancho,$resultado_Alto); #aplicamos un color de fondo a la nueva imagen #para poder visualizar que incluye la transparencia del png o del gif if($tipo=="png" OR $tipo=="gif"){ $fondo=imagecolorAllocate($im_base,255,255,200); imagefill($im_base,0,0,$fondo); } #superponemos la imagen importada sobre la que acabamos de crear imagecopyresampled($im_base,$importada,0,0,0,0, $resultado_Ancho, $resultado_Alto, $orig_Ancho,$orig_Alto); # visualizamos la imagen resultante imagejpeg($im_base); ImageDestroy(); ?>
Observa que –tanto en el ejemplo anterior como en el siguiente– solo hemos utilizado la extensión de la imagen original para elegir la función imagecreatefrom.... En el Header hemos puesto image/jpeg y, como es obvio, hemos utilizado la función asociada a este formato (imagejpeg). Si sustituimos ambos valores por los correspondientes a otro formato (gif, png) obtendríamos resultados similares.
<? # obtener la imagen $original="C:\\Apache\\htdocs\\cursoPHP\\images\\aviones4.jpg"; for($i=strlen($original)-1;$i>0;$i--){ if (substr($original,$i,1)=="."){ $tipo=substr($original,$i+1); break; } } # tamaño del original $tamano=getimagesize($original); $orig_Ancho = $tamano[0]; $orig_Alto =$tamano[1]; # estableceremos un margen en blanco alrededor de la imagen de 5 pixels # igual por los cuatro lados $margen=10; # establecemos rocortes para reencuadrar la imagen $recorte_izq=50; $recorte_sup=80; $recorte_der=40; $recorte_inf=60; # calculamos las dimensiones para utilizar como parámetros # en la funcion imagecopyresampled # ancho y alto original recortado $Ancho_recortado=$orig_Ancho-$recorte_izq-$recorte_der; $Alto_recortado=$orig_Alto-$recorte_sup-$recorte_inf; # factores de ampliación en este caso iguales # sin distorsión de imagen $ampliacion_X=1; $ampliacion_Y=1; # dimensiones del soporte $papel_Ancho=$Ancho_recortado*$ampliacion_X+ 2*$margen; $papel_Alto=$Alto_recortado*$ampliacion_Y+2*$margen; # dimensiones de la mancha de imagen al positivar # hay que quitar los márgenes $resultado_Ancho=$papel_Ancho -2*$margen; $resultado_Alto=$papel_Alto -2*$margen; switch($tipo){ case "jpg": $importada=imagecreatefromjpeg($original); break; case "png": $importada=imagecreatefrompng($original); break; case "gif": $importada=imagecreatefromgif($original); break; } Header("Content-type:image/jpeg"); $im_base=imagecreatetruecolor($papel_Ancho,$papel_Alto); $fondo=imagecolorAllocate($im_base,255,255,200); imagefill($im_base,0,0,$fondo); imagecopyresampled($im_base,$importada,$margen,$margen, $recorte_izq,$recorte_sup, $resultado_Ancho,$resultado_Alto, $Ancho_recortado,$Alto_recortado); imagejpeg($im_base); ImageDestroy(); ?>
|
Manual de PHP 54. Imágenes: Diagramas de sectores
Diagramas de sectores
Xc y Yc que son las coordenadas del centro de la elipse cuyo arco (o porción) tratamos de representar.
A y B que son las longitudes (expresadas en pixels) de los ejes horizontal y vertical de la elipse. Si ambos fueran iguales el resultado sería circular.
Pi y Pf son las posiciones (en grados sexagesimales) de los radios (inicial y final) que delimitan el sector que se trata de representar.
Los cero grados coinciden con el semieje horizontal positivo y el sentido del recorrido angular es el de las agujas del reloj.
$color es la variable -ha de ser definida previamente mediante imagecolorallocate- que indica el color que ha de utilizarse en el gráfico.
El último parámetro es un constante PHP que puede tomar uno de los siguientes valores:
IMG_ARC_PIE
IMG_ARC_NOFILL
IMG_ARC_EDGED
IMG_ARC_CHORD
Con la primera de las constantes dibuja el sector de elipse delimitado por los radios indicados relleno con el color especificado.
El segundo (IM_ARC_NOFILL) únicamente dibuja la porción de arco, pero no incluye los radios en el dibujo.
La opcion IMG_ARC_EDGED se comporta de forma idéntica a IMG_ARC_PIE cuando se utiliza de forma aislada aunque tiene una opción muy interesante que veremos un poco más abajo.
Con IMG_ARC_CHORD el resultado es un triángulo -relleno con el color indicado-formado por los dos radios y la cuerda correspondiente al arco que delimitan.
Combinar dos constantes
IMG_ARC_NOFILL|IMG_ARC_EDGED (fíjate en el signo | que separa ambas constantes) lo que obtenemos es la representación gráfica del contorno del sector (incluye los radios que lo delimitan). Mediante esta opción -con dos llamadas a la función- tenemos la posibilidad de representar el sector con un color de relleno (usando IMG_ARC_PIE) y, luego, superponerle un contorno de distinto color. Puedes verlo en los ejemplos.
Efecto tridimensional
Diagramas de sectores <? $im = imagecreate (400, 400); $fondo = imagecolorallocate($im, 226, 226, 226); $col1=imagecolorallocate($im,255,255,0); $col2=imagecolorallocate($im,255,0,0); imagefilledarc($im, 200, 200, 350, 300, 20, 240, $col1, IMG_ARC_PIE); imagefilledarc($im, 200, 200, 350, 300, 10, 150, $col2, IMG_ARC_NOFILL); header('Content-type: image/png'); imagepng($im); imagedestroy($im); ?> <? $im = imagecreate (400, 400); $fondo = imagecolorallocate($im, 226, 226, 226); $col1=imagecolorallocate($im,255,255,0); $col2=imagecolorallocate($im,255,0,0); imagefilledarc($im, 200, 200, 350, 300, 20, 240, $col1, IMG_ARC_EDGED); imagefilledarc($im, 200, 200, 350, 300, 10, 150, $col2, IMG_ARC_NOFILL); header('Content-type: image/png'); imagepng($im); imagedestroy($im); ?> <? $im = imagecreate (400, 400); $fondo = imagecolorallocate($im, 226, 226, 226); $color1=imagecolorallocate($im,255,0,0); imagefilledarc ($im, 200, 200, 350, 300, 20, 240, $color1, IMG_ARC_NOFILL|IMG_ARC_EDGED); header('Content-type: image/gif'); imagegif($im); imagedestroy($im); ?> <? $im = imagecreate (400, 400); $fondo = imagecolorallocate($im, 226, 226, 226); $color1=imagecolorallocate($im,255,0,0); imagefilledarc ($im, 200, 200, 350, 300, 50, 200, $color1, IMG_ARC_CHORD); header('Content-type: image/gif'); imagegif($im); imagedestroy($im); ?> <? $im = imagecreate (400, 400); $fondo = imagecolorallocate($im, 226, 226, 226); $color1=imagecolorallocate($im,200,0,0); $color2=imagecolorallocate($im,255,0,0); $color3=imagecolorallocate($im,255,255,255); for($i=200;$i<225;$i++){ imagefilledarc($im, 200, $i, 370, 270, 50, 330, $color1, IMG_ARC_NOFILL|IMG_ARC_EDGED); } imagefilledarc($im, 200, 200, 370, 270, 50, 330, $color2, IMG_ARC_EDGED); imagefilledarc($im, 200,200, 370, 270, 50, 330, $color3, IMG_ARC_NOFILL|IMG_ARC_EDGED); header('Content-type: image/gif'); imagegif($im); imagedestroy($im); ?> |
domingo, 22 de febrero de 2009
Software gratuito: opendisc
Bajo esta perspectiva, cuando hace unos años alguien le pedía a un "informático" - término súmamente devaluado que suele hacer referencia a alguien que es capaz de bajarse un programa y su respectivo crack de Internet para posteriormente instalarlo en cualquier equipo- que le instalase software en su ordenador, lo que "indirectamente" le estaba diciendo era algo como "traeme un Windows pirata y todos los cd´s que tengas con software en su versión "emule".
En la actualidad, cada vez somos más los que abogamos por la utilización de software libre -que además suele ser gratuito- por varias razones: la primera y evidente es la gratuidad del mismo, en segundo lugar suelen tener las mismas funciones que los productos comerciales, al menos aquellas que usamos en un 99,9999% de los casos, en tercer lugar porque la usabilidad (facilidad de manejo/aprendizaje) es casi idéntico al resto de programas y por último porque nos negamos a formar a futuros profesionales en un único software propietario (que además hemos tenido que pagar a precio de oro para publicitarlo a nuestros alumnos) que posteriormente ser verán abocados a comprar en su empresa. Por si esto fuera poco nos podremos olvidar de las llamadas de nuestro "amigo" de turno, avisándonos de que "el ordenador" ha actualizado el software que les instalamos y que ahora le saca una advertencia de que no tiene licencia y, por tanto, no lo puede ejecutar.
El siguiente paso, evidentemente consistirá en sustituir el sistema operativo dominante en nuestros hogares (léase la última versión del sistema operativo de Microsoft) por otro basado en Linux con los mismos elementos.
Para facilitar el uso de software libre y el "salto" de sistema operativo existen numerosos proyectos el que os presento hoy me parece muy interesante porque, precisamente, sigue el esquema comentado anteriormente. Se trata de una recopilación de software libre capaz de sustituir al comercial y agrupado igualmente por categorías para su instalación totalmente libre en nuestro sistema Windows. Como añadido han buscado software que también está disponible, de modo mayoritario, en entornos Linux, con lo cual la portabilidad de nuestros equipos de Windows a Linux, una vez conozcamos los programas a emplear, se verá tremendamente facilitada en lo que respecta a la pregunta básica a la hora de cambiarnos: ¿qué pasa con este programa X que empleaba para hacer Y, existe alguna versión para Linux?. La respuesta será no sólo existe sino que es exactamente igual.
El proyecto en cuestión que os presentof se llama OpenDisc y está disponible en dos versiones una "normal" y otra destinada a educación. A continuación os presento una relación del software disponible y las categorías en las que se encuentra agrupado (tan sólo he resumido en castellano las características de los empleados en Internet). Básicamente se trata de una imagen iso que os podréis descargar mediante Internet para después grabar en un cd, de modo que tengáis disponibles todos los programas que necesitéis una vez ya hayáis instalado el sistema operativo.
Finalmente sólo decir que bajo mi punto de vista , en la versión de educación le falta algún software libre para administración y control de aulas tipo italc.
Internet
- Azureus
- Filezilla
- Firefox
- HTTrack: para descargarse una página a tu disco duro y navegar por él, sin conexión.
- Pidgin: cliente de mensajería, chat,...
- RSSOwl: cliente rss
- SeaMonkey: cliente irc, news, editor HTML....
- Thunderbird: cliente email
- TightVNC: cliente ligero para manejar escritorios remotos
- WinSCP: cliente para conexión a servidores SSH, SFTP y SCP remotos.
Programas Incluidos en la versión Educación:
Office and Design
- OpenOffice.org - Fully compatible office software for your school work
- Dia - Make technical diagrams and flowcharts
- Scribus - Create professional looking posters and magazines
- GanttProject - Plan your school projects with this project management software
- FreeMind - Collect your ideas with this mind mapping Software
- PDF Creator - Make PDF documents from any program
- Sumatra PDF - Read PDF files quickly and easily
- Firefox - A safe, secure and fast web browser
- Thunderbird - Manage your emails better than ever - Reclaim your inbox!
- Pidgin - Talk to your friends whatever instant message client they use
- Kompozer - Create web pages easily, without having to code
- RSSOwl - Keep up with your favourite internet news feeds on your desktop
- GIMP - Edit digital photos and create graphics
- GIMP animation - Create animations
- Inkscape - Make professional looking vector graphics
- Blender - 3D graphic modeling, animation, rendering and playback
- Tuxpaint - Drawing program for children ages 3 to 12
- VLC - Play music, videos and DVDs
- Audacity - Record, edit and mix music
- TuxGuitar - Compose your own music
- Avidemux - Edit movies and add special effects
- Infra Recorder - Burn your own CDs and DVDs
- CamStudio - Record your actions on a computer
- Really Slick Screensavers - Great looking screensavers
- Nasa Worldwind - Discover the earth and other planets
- GraphCalc - A graphical calculator
- Guido Van Robot - Learn how computer programs work
- CarMetal - Cool mathematical modelling tool
- Maxima - University standard computer algebra system
- Celestia - Explore the universe in three dimensions
- Stellarium - A planetarium on your PC
- FreeCiv - Control the world through diplomacy and conquest
- FreeCol - Discover the ‘New World’ and build an empire
- TuxTyping 2 - Learn to type like a pro
- Tux of Math Command - Test your mathematical skills
- Winboard Chess - The classic game of chess
Página del proyecto: http://www.theopendisc.com
sábado, 21 de febrero de 2009
Jugar empleando Linux: Playonlinux
Es por ello, que la mayoría de usuarios que quieren emplear sus equipos para algo más que para trabajar -léase jugar- deben instalar wine (ya sabéis ese conjunto de librerías que sustituyen, NO EMULAN las empleadas por microsoft).
El principal inconveniente de esta solución es la complejidad de instalación de la misma para numerosos programas. Para salvar este inconveniente existe un programa "playonlinux" que basado en las librerías de wine nos permite ejecutar numerosos juegos de Windows, pero que también nos permite continuar empleando algunos de nuestros viejos programas de nuestro windows; todo ello desde un interfaz muy sencillo que facilita sobremanera la instalación de dichos programas. Además para instalar scripts no oficiales, tan sólo debemos ir a Herramientas-->ejecutar scripts no oficiales
Para instalar playonlinux en Ubuntu:
Hardy
sudo wget http://deb.mulx.net/playonlinux_hardy.list -O /etc/apt/sources.list.d/playonlinux.list |
Gutsy
sudo wget http://deb.mulx.net/playonlinux_gutsy.list -O /etc/apt/sources.list.d/playonlinux.list |
Página de playonlinux en castellano: http://www.playonlinux.com/es
Página de descarga: http://www.playonlinux.com/es/download.html
Manual de PHP 53. Imágenes: Manejando Fuentes
Utilizando fuentes TrueType
Instalación de fuentes
En ese subdirectorio hemos incluido dos fuentes TrueType manteniendo en una de ellas el nombre original (arial.ttf) y renombrado la otra como fuente2.ttf.
Como podrás comprobar en los ejemplos, no hay problema alguno por el hecho de renombrar las fuentes.
Escribiendo con fuentes TrueType
Imagettftext($nom, tam, ang, x, y, $col, $fuente, $txt)
donde:
$nom es, como siempre, el nombre de la imagen.
tam es un número entero que indica el el tamaño de la fuente.
ang es el giro expresado en grados sexagesimales que pretendemos que tenga la cadena de texto. Si ang=0 el texto aparecerá escrito en horizontal.
x e y son las coordenadas del punto de inicio de la inserción del texto. Ese punto coincide con la esquina inferior izquierda del rectángulo imaginario que contiene el texto.
$col es el color a utilizar en el texto.
$fuente es una cadena de texto que contiene el path y el nombre de la fuente. Observa los ejemplos.
$txt es el nombre de la variable que contiene el texto a insertar.
Colocando textos
$rec= ImageTTFBBox (tam, ang, $fuente, $txt)
donde: tam es el tamaño de la fuente a utilizar.
ang es el ángulo de rotación del texto que tendría valor cero en el caso de orientación horizontal.
$fuente es el path y nombre de la fuente a a utilizar.
$txt es el nombre de la variable que contiene el texto a incluir.
La variable $rec recoge un array escalar cuyos valores son las coordenadas de las cuatro esquinas de la caja de texto.
Los índices correspondientes a cada uno de los elementos de ese array son los siguientes:
- Inferior izquierdo
Sus coordenadas son:
$rec[0],$rec[1]
- Inferior derecho
Sus coordenadas son:
$rec[2],$rec[3]
- Superior derecho
Sus coordenadas son:
$rec[4],$rec[5]
- Superior izquierdo
Sus coordenadas son:
$rec[6],$rec[7]
- Las correspondientes al vértice inferior izquierdo son siempre (0,0).
- Los puntos situados por encima del (0,0) tienen ordenada negativa.
- Las abscisas de los puntos situados a la izquierda del (0,0) son negativas.
Dibujando segmentos Aunque presentaremos únicamente el código fuente de una de las imágenes, para hacer la comprobación de las funciones y las diferencias de visualización insertaremos dos ejemplos. Uno en formato PGN y otro en JPG. Recuerda que las únicas diferencias entre ambos radican en utilizar: Header("Content-type: image/png") o Header("Content-type: image/jpeg") y en las funciones Imagepng ó Imagejpeg. Texto TrueType horizontal <? Header("Content-type: image/png"); $im = imagecreate(400,300); $fondo=imagecolorallocate ($im, 255, 255, 210); $rojo=imagecolorallocate ($im, 255, 0, 0); $texto="PHP"; Imagettftext($im, 40, 0, 100, 270, $rojo, "./fuentes/fuente2.ttf", $texto); Imagepng($im); imagedestroy($im); ?>
Texto TrueType girado <? Header("Content-type: image/png"); $im = imagecreate(400,300); $fondo=imagecolorallocate ($im, 255, 255, 210); $rojo=imagecolorallocate ($im, 255, 0, 0); $texto="Me gusta PHP"; Imagettftext($im, 40, 30, 100, 270, $rojo, "./fuentes/fuente2.ttf", $texto); Imagepng($im); imagedestroy($im); ?>
Centrando textos Aquí tienes un ejemplo donde utilizando ImageTTFBox e ImageTTFText se puede centrar un texto -tanto si es horizontal como si está girado- con relación a un punto. En este ejemplo, el punto de referencia para el centrado es (200,150) que es el centro de la imagen. Las coordenadas de ImageTTFText, como puedes ver, están calculadas usando las coordenadas de ese punto de referencia y los valores del array generado por ImageTTFBox . Si la variable que contiene el array generado por ImageTTFBox se llama $pepa, las coordenadas del centro del rectángulo imaginario son $pepa[4]/2 y $pepa[5]/2 Partiendo de esos valores, si queremos centrar el texto sobre un punto de la imagen cuyas coordenadas son (X,Y) nos basta con escribir como parámetros de la función ImageTTFText los siguientes:
Este procedimiento es válido tanto para textos horizontales como para textos girados. Aquí lo tienes: <? Header("Content-type: image/png"); $im = imagecreate(400,300); $fondo=imagecolorallocate ($im, 255, 255, 210); $gris=imagecolorallocate ($im, 160, 160,160); $rojo=imagecolorallocate ($im, 255, 0, 0); $texto="El mundo del PHP"; $texto1="lleno de posibilidades"; $marco= ImageTTFBBox (40, 0, "./fuentes/arial.ttf", $texto); Imagettftext($im, 40, 0, 200-$marco[4]/2, 150-$marco[5]/2, $gris, "./fuentes/arial.ttf", $texto); $marco1= ImageTTFBBox (30, 30, "./fuentes/fuente2.ttf", $texto1); Imagettftext($im, 30, 30, 200-$marco1[4]/2, 150-$marco1[5]/2, $rojo, "./fuentes/fuente2.ttf", $texto1); Imagepng($im); imagedestroy($im); ?>
Un ejemplo resumen Aquí tienes un ejemplo bastante completo de generación de imágenes dinámicas.
En servidores UNIX y LINUX la forma en la que indicamos el path del directorio que contiene las fuentes varía sustancialmente respecto a la que hemos utilizado en estos ejemplos. En aquellos, además de invertir los separadores, se requiere indicar siempre rutas absolutas, con lo cual habría que hacer las modificaciones oportunas si se tratara de publicar en un hosting que utilice alguno de estos sistemas operativos. |