Sustituir un color por otro color en ImageMagick con -fill y -opaque

03 Septiembre 2018 by 0 Comment Multimedia 3807 Views
Ya hemos visto al escribir textos tanto sobre una imagen ya creada, como en una nueva imagen el parámetro -fill de ImageMagick. Incluso lo hemos usado al generar las teclas de un teclado. Pero -fill no sólo sirve para escribir textos, sino que nos permite seleccionar el color con el que vamos a trabajar, bien para escribir, bien para dibujar con -draw, bien para pinta áreas... Veamos distintas posibilidades que ofrece -fill con varios ejemplos. Primero, vamos a crear una imagen con franjas roja, verde y azul, repetidas dos veces para que se vea bien cómo funciona fill: convert -size 500x50 xc:Red xc:Green xc:Blue 500x50 xc:Red xc:Green xc:Blue -append colores.png Cambiar colores con ImageMagick Ahora que ya tenemos la imagen creada, podemos cambiar uno de los colores con -opaque y -fill. Como he comentado antes, -fill selecciona el color con el que estamos trajabajando. Es como si tomásemos un rotulador de un determinado color. Todo lo que hagamos con ese rotulador, será de ese color. Y podemos seleccionar que queremos trabajar sobre todos los pixeles de un determinado color con -opaque. Y si los unimos, podemos sustituir un color por otro con: convert colores.png -fill Black -opaque Blue rojoverdenegro.png Con…
Leer más ...

Trabajar con las tipografías de nuestro sistema con ImageMagick

02 Septiembre 2018 by 0 Comment Multimedia 2543 Views
Ahora que ya sabemos crear lienzos con textos y añadir textos a imágenes con ImageMagick, vamos a evolucionar nuestros scripts y nuestros diseños trabajando con las tipografías. Listar las tipografías instaladas Para listar las fipografías que tenemos en nuestro sistema, podemos usar el parámetro -list de ImageMagick: convert -list font Esto nos dará un listado enorme de tipografías e información sobre ellas, así que si queremos verlas una a una hemos de filtrar la salida del comando. Por ejemplo, podremos ver todo el listado y movernos por él con convert -list font | less Saber el número de tipografías instaladas Como vemos en el anterior, al listar las tipografías, convert muestra el fichero que lee al listar las tipografías (/etc/ImageMagick-6/type-ghostscript.xml). Pero no es el único fichero xml de donde puede leer, sino de todos los /etc/ImageMagick-6/type-*. Y luego muestra seis líneas por tipografía. Así pues, si queremos saber cuántas tipografías tenemos instaladas, podemos usar un pequeño script que nos reste las líneas que no nos interesa y el resultado dividirlo entre seis (es una opción tan válida como cualquier otra) u optimizar el esfuerzo escribiendo: convert -list font | grep "Font:" | wc -l Listar las tipografías limpias Ahora que…
Leer más ...

Escribir un texto sobre una imagen ya creada con -annotate

02 Septiembre 2018 by 1 Comment Multimedia 7730 Views
Ya sabemos crear un lienzo desde cero con un texto con ImageMagick, pero, ¿y si queremos escribir un texto sobre una imagen ya creada? Para eso tenemos el parámetro -annotate. Para ver cómo trabaja, vamos a crear una imagen nueva lisa para que destaque bien el texto: convert -size 500x200 xc:LightBlue fondoazulclaro.png Una vez que ya tenemos la imagen de fondo, vamos a escribir sobre ella. Los parámetros para definir la tipografía, su tamaño, la gravedad, el color... son iguales que para label, por lo que no tenemos que aprender nuevos conceptos, sino reutilizar lo que ya sabemos:  convert fondoazulclaro.png -fill Black -pointsize 30 -font YonderRecoil -gravity Center -annotate +0+0 "Linux Center" cartelalinuxcenter.png ¿Cómo trabajar con -annotate? Como digo, los parámetros auxiliares de annotate son los mismos que para trabajar con label, lo único que cambia es el parámetro -annotate y lleva tres valores: los puntos de desplazamiento en anchura y altura respecto al punto de gravedad y el texto a escribir, que puede ser una cadena de texto o una variable. Si en lugar de exactamente en el centro (-gravity Center y luego, -annotate +0+0) queremos que haya un desplazamiento, podemos indicarlo modificando los valores que le pasamos a…
Leer más ...

Generar las teclas de un teclado en ImageMagick

01 Septiembre 2018 by 0 Comment Multimedia 2232 Views
Ahora que ya hemos visto cómo hacer imágenes con ImageMagick que contengan un texto, vamos a ver un nuevo parámetro, -frame, que genera marcos con sombreado simulando volúmenes. Y, para verlo, vamos a hacer las teclas de un teclado, por ejemplo, para hacer tutoriales y superponer combinaciones de teclas o atajos de teclado. #!/bin/bashfor i in {A..Z} TAB CTR MAY ALTdo    convert -background "#d7d7d7" -fill Black -gravity Center -font DejaVu-Sans-Bold -pointsize 50 label:"$i" -frame 8x8+8+0 $i.pngdone Con {A..Z} indicamos que recorra todos los carácteres que van de la A a la Z, es decir, todas las mayúsculas, menos la Ñ, pero si lo que queremos es un teclado para mostrar combinaciones de teclas, con esto nos serviría. El resto de instrucciones y parámetros los conocemos, excepto -frame 8x8+8+0 -frame indica que haga un marco con un grosor determinado en anchura y en altura, la primera parte del valor (8x8), con una profundidad en el ángulo inferior derecho (+8) y sin profundidad en el ángulo superior izquierdo (+0). Es importante que las cifras del segundo bloque sean distintas, si no, no crea efecto de relieve, si la primera es mayor; o de rehundimiento, en caso de que la segunda sea mayor…
Leer más ...

Capturar pantallazos con import

31 Agosto 2018 by 0 Comment Multimedia 2895 Views
Import es una herramienta de la suite ImageMagick que permite capturar imágenes de la pantalla del ordenador. Podemos caputrar la pantalla completa, únicamente una ventana, una porción de la ventana... veamos cómo hacerlo: La sintaxis básica del comando sería: import pantallazo.png Al escribir esto, se nos pone el cursor en forma de cruz. Con este cursor, podemos hacer dos cosas: Pinchar sobre una ventana y capturará toda la ventana: Seleccionar una zona con el ratón y se capturará esa zona:   Otra opción que nos permite trabajar sin el ratón es capturar toda la pantalla con import -w nombredelaventana (para la pantalla completa, usaremos root) y con la pantalla capturada, podemos escalarla, seleccionar una zona... import -w root -resize 500x pantallacompleta.png   import -w root -crop 500x300+0+0 pantallarecortada.png   También podemos usar gravity: import -w root -gravity Center -crop 500x300+0+0 pantallarecortadacentrada.png   Para preparar bien la captura, por ejemplo, si queremos que no aparezca la pantalla de la terminal o poner en primer plano la pantalla que queremos capturar, podemos decirle a import que haga una pausa desde que le indicamos que capture hasta que haga la captura. Se lo indicamos con -pause $numero de segundos. import -pause 2 -w…
Leer más ...

Crear lienzos con textos en ImageMagick

30 Agosto 2018 by 1 Comment Multimedia 3615 Views
Vamos a ver cómo crear lienzos con textos en ImageMagick. Es decir, crear una imagen de la nada con un fondo y letras. Para escribir sobre una imagen existente está el parámetro -annotate, pero eso es materia de otro artículo. Para crear estos lienzos con textos veremos los siguientes parámetros de convert: -size: determina el tamaño de la imagen -font: especifica la tipografía a utilizar -pointsize: permite especificar el tamaño de la tipografía label: (no lleva guión delante) indica la etiqueta que se escribirá en el lienzo, el texto a escribir -gravity: localiza el punto de referencia sobre el que se posicionará el texto -background: establece el color de fondo del lienzo -fill: especifica el color principal con el que trabajaremos, en caso de los textos, el color de las letras -interword-spacing: separación entre las palabras -kerning: separación entre las letras -interline-spacing: separación entre líneas Para ver cómo funcionan cada uno de estos parámetros, veremos una serie de ejemplos que lo ilustren: Texto por defecto en negro sobre blanco: convert label:"Todo está en los libros" negrosobreblanco.jpg     Si únicamente le indicamos el parámetro label, utiliza la tipografía y el tamaño por defecto, dependiendo de la versión y de las…
Leer más ...

Añadir una pista de audio a un vídeo con ffmpeg

30 Agosto 2018 by 9 Comment Multimedia 20636 Views
Tenemos un vídeo, al que llamaremos video.mp4 Tenemos una pista de audio, a la que llamaremos audio.mp3 Tenemos una necesidad, que es unir la pista de audio al vídeo. Tenemos un programa en nuestra shell, que es ffmpeg. Combinamos todo: ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a copy videoconaudio.mp4 Y ahora que tenemos la pista de audio y la de vídeo unidas, vamos a ver qué hemos hecho: ffmpeg -> nombre del comando -i video.mp4 -> definimos una entrada -i audio.mp3 -> definimos otra entrada -c:v copy -> definimos que no queremos cambiar el códec de vídeo (copia el que tiene la pista de vídeo) -c:a copy -> definimos que no queremos cambiar el códec de audio (copia el que tiene la pista de audio) videoconaudio.mp4 -> nombre del fichero que se generará con la unión de la pista de vídeo y la pista de audio.
Leer más ...

Función para numerar fotogramas

Ahora que sabemos editar un vídeo a partir de una secuencia de fotogramas con ffmpeg nos encontramos con que para poder hacerlo, los fotogramas han de estar numerados correlativamente y todos con el mismo número de dígitos en el numeral para que los ordene bien en el vídeo, lo cual es sencillo, pero si lo automatizamos, mejor. Aquí os dejo la función que utilizo para ello: function devuelvefotograma(){ # Función que recibe el numeral del último fotograma creado y devuelve el fotograma a utilizar como imagen destino por convert     esentero='^[0-9]+$'    numerofotograma=$1        if [ -z $numerofotograma ] || ! [[ $numerofotograma =~ $esentero ]]    then        let numerofotograma=1    fi        if [ $numerofotograma -lt 10 ]    then        fotograma="fotograma000"$numerofotograma".png"        elif [ $numerofotograma -ge 10 ] && [ $numerofotograma -lt 100 ]    then        fotograma="fotograma00"$numerofotograma".png"    elif [ $numerofotograma -ge 100 ] && [ $numerofotograma -lt 1000 ]    then        fotograma="fotograma0"$numerofotograma".png"    else        fotograma="fotograma"$numerofotograma".png"    fi    echo $fotograma;}   Explicación de la función   Primero defino la función y le llamo devuelvefotograma, ya que me gusta que el nombre de una función sea descriptivo, así que suelo usar un imperativo que indique lo que quiero que haga. Una descripción de qué…

Información adicional

  • Nivel de dificultad Bajo
  • ¿Tutorial sacado de otra web/foro? No
Leer más ...
Visto 2187 veces

Descomponer vídeo en fotogramas, componer fotogramas en un vídeo y crear fotogramas directamente a un vídeo

28 Agosto 2018 by 0 Comment Multimedia 6397 Views
Uno de los mejores compañeros de viaje de ImageMagick a la hora de procesar vídeo es ffmpeg. ffmpeg es un programa de edición de vídeo que permite, desde la línea de comandos crear vídeos, editarlos, extraer el audio, combinar una pista de audio y otra de vídeo generadas individualmente en una mismo fichero... Tiene todas las funcionalidades de cualquier programa de edición de vídeo (la mayoría de los programas de edción de vídeo en modo gráfico se basan en ffmpeg para procesar vídeos y lo que hacen es que visualmente sea un poco más amigable) con la ventaja de ser en modo consola, por lo que permite automatizar procesos y usarlo en scripts, como contrapartida, es un poco farragoso de usar y no tan cómodo de trabajar como Kdenlive, OpenShot, Pitivi u otro programa gráfico. Pero ahora vamos a ver cómo sacarle mucho partido en combinación con ImageMagick descomponiendo un vídeo en fotogramas para poder procesar individualmente cada uno de ellos con IM, componiendo una serie de fotogramas en vídeo y generando un vídeo al vuelo en un script sin tener que almacenar los fotogramas en el disco y luego generar el vídeo que, como comenté al explicar qué son…
Leer más ...

Dados cargados en $RANDOM

Ya hemos visto que $RANDOM%$limitesuperior no funciona. Hemos visto que $RANDOM%1 para hacer tiradas "a cara o cruz" no funciona. Y del mismo modo que deberemos sospechar (y no apostar) si vemos que un trilero siempre saca el mismo resultado lanzando una moneda, cuando lanza un dado puede que haga también trampa. Los dados se pueden cargar y hacer que un lado pese más, por lo que hay más posibilidades de que ese lado sea el que se apoye en la mesa y, por lo tanto, sea el lado apostado el que quede arriba. Pasa lo mismo con $RANDOM: #!/bin/bashlet nocoincide=0for i in $(seq 1 1000)do    for x in $(seq 1 1000)    do       let numero=$((RANDOM%$x))       if [ $numero -lt 10 ]       then            echo $numero >> coincidencias.txt       fi        donedonefor i in $(seq 0 9)do    echo "Veces que se repite "$i    fgrep -o $i coincidencias.txt | wc -ldone   El resultado que me ha dado es (cada vez que lo probemos saldŕa algo distinto, ya que son números aleatorios): Veces que se repite 07559Veces que se repite 16668Veces que se repite 25941Veces que se repite 35730Veces que se repite 45387Veces que se repite 55219Veces que se repite 65053Veces que se repite…

Información adicional

  • Nivel de dificultad Medio
  • ¿Tutorial sacado de otra web/foro? No
Leer más ...
Visto 3522 veces

Más sobre la aleatoriedad de $RANDOM

En otro artículo ya comenté que para hacer una especie de "cara o cruz" en el que de forma aleatoria nos muestre 0 o 1, $RANDOM%1 no funciona, ya que siempre da 0. En un comentario me decían que dividir una cantidad entre 1 no da decimales. Es cierto, nunca podrá haber rendondeo a la alza porque nunca podrá haber redondeo y, por lo tanto, nunca podrá salir la cantidad indicada como límite superior del rango. Voy a hacer un script en el que saquemos muchos números aleatorios. Por ejemplo, que mil veces haga una tirada aleatoria con resultados del 0 al 1.000.  #!/bin/bashfor i in $(seq 1 1000)do    for x in $(seq 1 1000)    do       let numero=$((RANDOM%$x))       if [ $numero -eq $x ]       then            echo $x        fi    donedone Al ejecutarlo no sale nada. Y repito, y repito, y repito la ejecución del script. Siempre sin ningún resultado. ¿Me habré equivocado? Voy a acumular las veces que el resultado no coincide con el límite superior: #!/bin/bashlet nocoincide=0for i in $(seq 1 1000)do    for x in $(seq 1 1000)    do       let numero=$((RANDOM%$x))       if [ $numero -eq $x ]       then            echo $x        else            let nocoincide++       fi        donedoneecho "Han salido…

Información adicional

  • Nivel de dificultad Medio
  • ¿Tutorial sacado de otra web/foro? No
Leer más ...
Visto 2628 veces

Escribir en un fichero de texto desde un shell script en Bash

25 Agosto 2018 by 1 Comment Programación 48055 Views
Cuando queremos escribir en un fichero de texto desde un script de Bash, tenemos dos opciones: Que queramos sobreescribir el fichero con el texto que le enviemos Que queramos anexar el texto a un fichero ya existente La primera opción la haremos con: echo $variable > fichero.txt La segunda opción, con >>: echo $variable >> fichero.txt Ejemplos Si queremos escribir únicamente el último resultado: #!/bin/bashfor i in $(seq 1 100)do      echo $i > numeros.txtdone   Si queremos un fichero en el que se almacene una lista de números del uno al cien: #!/bin/bashfor i in $(seq 1 100)do      echo $i >> numeros.txtdone

Información adicional

  • Nivel de dificultad Bajo
  • ¿Tutorial sacado de otra web/foro? No
Leer más ...
Visto 48055 veces

El mito de $((RANDOM%$limitesuperior)) y los números aleatorios en Bash

Si queremos un número aleatorio en Bash, tenemos la función de Bash RANDOM. Es una función del intérprete de comandos, por lo que no lo podemos ejecutar como comando, sino que si queremos desde la línea de comandos un número aleatorio, deberemos escribir: echo $RANDOM Esto nos dará un número aleatorio entre 0 y 32.768 (2 elevado a 15). Pero, ¿qué pasa si queremos delimitar el rango en el que queremos el número aleatorio? Podemos dividirlo por el límite superior y, al devolver el módulo, siempre será, como máximo, el número indicado menos uno. En muchos artículos y tutoriales  que dicen que el número que indicamos después del símbolo de porcentaje es el límite superior, pero esto no es así. Veamos un caso extremo: #!/bin/bashcontador=0for i in $(seq 1 100000)do    let numero=$((RANDOM%1))    if [ $numero -eq 1 ]    then         let contador=$contador+1    fidoneecho $contador   Le digo que haga un bucle cien mil veces y que calcule un número aleatorio entre el 0 y el 1. Que cuente cuantas veces sale 1 y muestre el número de veces que ha salido 1. El resultado siempre es 0. Así pues, cuando queráis un número aleatorio con un rango, sumadle uno…

Información adicional

  • Nivel de dificultad Bajo
  • ¿Tutorial sacado de otra web/foro? No
Leer más ...
Visto 8129 veces

Hallar todos los divisores de un número en shell script

Vamos a ver cómo calcular todos los divisores de un número. Esto nos puede servir, por ejemplo para calcular en cuantas piezas iguales podemos dividir un fotograma. Veamos un script que lo hace: #!/bin/bashfunction hallatodoslosdivisores(){    divisores=""    for i in $(seq 1 $1)    do        let resto=$1%$i        if [ $resto -eq 0 ]        then            divisores=$divisores$i" "        fi    done    echo $divisores}let numero=1920todoslosdivisores=$(hallatodoslosdivisores $numero)echo "Los divisores de "$numero" son: "$todoslosdivisores Explicación del script: En una función llamada hallatodoslosdivisores, le indicamos que cree una variable vacía para poder ir rellenando de las cadenas que le digamos según si cumplen o no el requisito que buscamos. Después le decimos que recorra desde 1 hasta el número que le indicamos y que calcule el módulo, es decir, el resto de la división. Si el resto es 0, es que ese número es divisor del parámetro que le hemos indicado, así que se deberá incluir en el listado. En esa instrucción (divisores=$divisores$i" ") le digo que anexe también un espacio en blanco, así podemos separar fácilmente los divisores. Una vez recorrido desde 1 hasta el número indicado y hallados todos los divisores de ese número, que la función devuelva el resultado para…

Información adicional

  • Nivel de dificultad Bajo
  • ¿Tutorial sacado de otra web/foro? No
Leer más ...
Visto 9557 veces

¡Atención! Este sitio usa cookies y tecnologías similares.

Si no cambia la configuración de su navegador, usted acepta su uso. Saber más

Acepto

Vea nuestra política de cookies y enlaces de interés aquí