Showing posts with label prtogramación. Show all posts
Showing posts with label prtogramación. Show all posts

Thursday, May 10, 2018

Un método de dithering muy fácil de implementar


Las computadoras y sus correspondientes impresoras, son básicas en el trabajo moderno. En muchísimas empresas se trabaja con equipo de cómputo e imprimen contínuamente sus reportes, resultados, documentos, hojas de cálculo, gráficas, etcétera. Y aunque hoy en día hay muchas impresoras que pueden imprimir en color, en ocasiones esto es un gasto extra que en ocasiones no se justifica. De hecho, muchas impresiones en blanco y negro son suficientemente buenas.
Pues bien, si se tiene una gráfica en color y la impresora que se usa solamente imprime en blanco y negro, ¿cómo es que puede imprimir imágenes en tonos de gris? Tómese en cuenta que hablamos de una impresora que tiene un cartucho de tinta negra y ya, es decir, sólo tiene opción a dos colores: blanco (no imprime nada) y negro (imprime un punto con tinta negra).

La solución a este problema se llama dithering y es algo que se analiza en el proceso digital de imágenes. Aquí la idea es sacar ventaja de cómo el cerebro se encarga de interpretar las imágenes que el ojo le manda. Por ejemplo, si se quiere imprimir un color magenta, lo que se hace es un tramado de la siguiente manera, considerando por ejemplo, que sólo se tienen dos colores, rojo y azul:



Como puede verse, se hace una cuadrícula y se ponen alternadamente los colores. Y entonces hacemos dicha cuadrícula más chica cada vez hasta que ya el rojo y el azul no se ven y entonces el ojo interpreta el tramado como magenta. Así, podemos simular un color aunque no necesariamente tengamos esa tinta en particular para imprimirlo. Esto se llama dithering genéricamente.

El mecanismo de dithering se usa en las impresiones de revistas, periódicos y libros desde hace muchos años. Hay diversas técnicas y de las más usadas ha sido la de semitonos, la cual ya hemos analizado en unocero (buscar semitonos). Muchos libros y revistas en color usan en ocasiones cuatro tintas, y con ellas generan los colores necesarios usando estos tramados que dejan de ser visibles a la vista común, aunque con un cuentahilos pueden observarse.

Sin embargo, el dithering ha sido muy estudiado quizás desde que Floyd y Steinberg en 1968 (poner referencia wikipedia) escribieron un novedoso artículo indicando una nueva idea para procesar imágenes y ditherizarlas (valga la expresión). Esto dio pie a que otros investigadores hallaran otras matrices de ditherización y el cuadro se completó. Un trabajo sencillo de seguir puede verse aquí (ver tannerhelland), en donde explica los métodos de dithering más comunes.

Uno de esos métodos es el dithering al azar, el cual es sencillo pero de alguna manera funciona muy bien con algún tipo de imágenes en particular, sobre todo aquellas en donde hay gradientes, es decir, difuminación de color, por ejemplo, de oscuro a claro. Lo interesante del método de dithering al azar es que es muy fácil de entender y además, ilustra muy bien cómo el sistema puede simular diferentes tonos usando solamente dos colores, en este caso blanco y negro.

Hay que decir que este sistema de dithering no es muy usado porque en general las imágenes a ditherizar no tienen las características que lo hacen aceptable, pero es una muy sencilla introducción del problema de imprimir una imagen cuando se tienen menos colores que los que son necesarios.
Lo que se hace es simple, para cada punto en la pantalla, se genera un número al azar en el rango de 0 a 255. Si el valor al azar es mayor que el valor del pixel, entonces se pinta un punto blanco, sino, se pinta uno negro. Así de simple.

El código en Delphi es este:



Un par de ejemplos pueden mostrar la idea y la bondad de este dithering particular:



En el caso del degradado de grises (el gradiente), el resultado es bastante aceptable, pero ya en el caso de la imagen del David de Miguel Angel, el resultado ya no me gusta tanto. Sin embargo, como ya dijimos, en algunos casos la naturaleza de la imagen ayuda, por ejemplo, esta:






Quien le interese usar mi programa con este y otros métodos de dithering, entre otras cosas, puede pedírmelo a morsa@la-morsa.com.

Thursday, August 14, 2014

Reto de la programación lúdica: protector de pantalla



Todos sabemos que los protectores de pantalla surgieron de la necesidad de evitar que las pantallas de rayos catódicos, como en las televisiones de hace unos años, “quemaran”  el fósforo de las pantallas y las dejara “marcadas”. Por ejemplo, me tocó ver monitores con las marcas típicas de los programas como las hojas de cálculo, en donde se observaba claramente una imagen fantasmal de cómo se veía el programa en cuestión cuando se utilizaba.

Por ello los protectores de pantalla existen, buscando resolver esta dificultad. Esto llevó, como evolución básica quizás, a la creación de protectores de pantalla que ponían imágenes en movimiento, animaciones, gráficas muilticolores que iban cambiando, etcétera, cuando finalmente el mejor protector de pantalla es el que se apague la pantalla hasta que el usuario toque alguna tecla, mueva el ratón o bien, toque el monitor en estas posmodernas interfaces táctiles.

Así entonces, en este reto de la programación lúdica buscamos un protector de pantalla orioginal, moderno, que aparte de cumplir con la tarea de evitar el desgaste innecesario del monitor, nos presente algo artístico, divertido tal vez. Ustedes -programadores- son quien deciden.

El reto implica hacer no solamente un programa que haga algo en la pantalla, sino que se pueda poner en el listado de los protectores de pantalla de Windows. No se trata de que me pasen un enlace a uno de los miles y miles de protectores de pantalla que ya han sido escritos, sino que la idea es que se programe,en el lenguaje que quieran, su propio protector.

En este caso no hay dificultades ni problemas para usar bibliotecas en su propia herramienta de programación. La condición sine qua non (es decir, obligatoria), es que el programa pueda ponerse en la carpeta donde residen los protectores de pantalla de Windows y pueda usarse como tal. Igualmente, el protector de pantallas debe ser para el sistema operativo Windows 7 en adelante.


Los protectores de pantalla son programas que en términos generales funcionan como cualquier ejecutable, aunque tienen un par de especificaciones que hay que tomar en cuenta.Una de ellas es que los archivos no son .exe sino .scr, pero me parece hay un par de cosas que hay que contemplar para hacer un protector de pantalla.  Sugiero le echen un vistazo a este enlace para resolver los detalles técnicos que tiene este tipo de programas.

Este tipo de programas, probablemente puedan encontrarlo en la red. No se trata pues de copiarlo de algún sitio. Si descubro una copia o si tengo dudas, me tomo la libertad de preguntarle al autor directamente cómo hizo, para garantizar así que la solución fue escrita y no copiada por el autor del programa. Juguemos pues limpiamente y aprendamos todos de estos retos.

¿El premio? Una taza con el logotipo de la Morsa a la mejor solución, en donde ganará el que visualmente sea más atractivo. Como esto es una cuestión subjetiva, un jurado calificado por los articulistas de unocero (más otros personajes externos [sus nombres se mencionarán al terminar el concurso]), serán quienes tomen la decisión y ésta es inapelable. Hay también una gorra y una libreta de notas, cortesía de Qualcomm (sólo para quienes residan en el DF). Habrá probablemente más premios, pero estos son los que están asegurados.

El premio de la taza (con el añadido de la gorra y el cuaderno de notas), solamente aplica a los programadores que vivan en el DF (mandar a provincia o a otros países una taza es estúpidamente costoso). En caso de que los concursantes sean de otros países o de la provincia mexicana, el premio será una memoria USB de 8 GBytes al menos y se les enviará por correo certificado.

Así que ¡manos a la obra! Sorpréndanme…