Eli
25meneos

Convierte imagenes en archivos html+css

img2xhtml es una utilidad para GNU/Linux que dada una imagen, genera un archivo html+css que pinta exactamente la misma imagen contenida en el archivo original, para ello, crea pequeños elementos xhtml de 1 pixel, y utiliza varias técnicas de optimización para reducir su tamaño.

negativos: 0  usuarios: 22  anónimos: 3  compartir:  twitter  facebook  friendfeed
  1. #1   Es curioso ver como para hacer este tipo de chuminadas el javascript te peta el pc y tenemos que pasar a los metodos mas estaticos... los de "toda la vida".

    Personalmente me encanto la optimizacion... ;)
    votos: 0, karma: 6
    por Martes13 el 22-09-2008 20:07 UTC
  2. #2   #1 no es javascript

    Edit: vale, entendí mal el comentario xD
    votos: 0, karma: 10
    por sparker el 22-09-2008 20:17 UTC
  3. #3   La idea me mola pero este código solo funciona en linux, vaya mierda... Estos linuxeros siempre discriminando
    votos: 0, karma: 7
    por Torocatala el 22-09-2008 20:33 UTC
  4. #4   #3 con lenguajes como java, tienes más potencia para hacer este tipo de tratamiento de imágenes (tiene soporte nativo para más formatos), y con librerías externas en algunos lenguajes script (por ejemplo, en PHP tienes las bibliotecas GD), es fácil hacer esto.
    votos: 0, karma: 10
    por sparker el 22-09-2008 20:37 UTC
  5. #5   #4 seguro que el próximo gimp está hecho en php con gd, o en java.
    votos: 0, karma: 9
    por jcarlosn el 22-09-2008 20:46 UTC
  6. #6   #5 qué va, hombre, será bash con llamadas a ImageMagick :P
    votos: 1, karma: 16
    por maeghith el 22-09-2008 21:03 UTC
  7. #7   #5 tu estás generando un archivo html a partir de un jpg para luego (supongo) pegarlo en la web... ¿no ves más viable usar un lenguaje como PHP o Java (en la parte del servidor) para generar esa imagen dinámicamente?

    Seguro que el próximo gimp es vía web xD
    votos: 0, karma: 10
    por sparker el 22-09-2008 21:03 UTC
  8. #8   #7 claro,es una buena opción, pero algunas mejoras que he pensado y probado en php, tardan minutos, y segundos en C, piensa en las capas de abstracción que tienes en java o en php, y en como crece el tamaño del problema, conforme crece la imagen, sin llegar a tamaños raros.

    Por ello, lo mas fácil es ejecutar el binario compilado con optimización etc, y leer su salida desde php, por ejemplo.

    Aunque sería interesante hacerlo en PHP, temo que no escalase mucho, por ejemplo, una técnica que estoy probando para reducir mas aún los pixeles, es jugar con áreas muy densas en x color, crear allí un cuadro detras, y no pintar ciertos pixeles.

    Solo para crear una estadística de la densidad de áreas, en C tarda 2-3-4 segundos, depende, imaginalo en Java, no lo veo viable, aunque quizá me equivoque.
    votos: 0, karma: 9
    por jcarlosn el 22-09-2008 21:12 UTC
  9. #9   No sé #8, yo acabo de hacer un script cutrecillo en PHP para dibujar JPEG's y es instantáneo (probado con la imagen que has posteado en el blog). Tarda 0,04s (según wget), y no está optimizado para nada:

    Edit: posteo el code en pastebin: pastebin.com/f16b905fe

    0.04 segundos teniendo en cuenta el paso por Apache, lo que tarde wget en enviar y recibir cabeceras... Pero bueno, dejémoslo en 0.04s.

    Con java, obviamente, rularía mucho más rápido. Si mañana tengo tiempo en el curro lo pruebo.
    votos: 0, karma: 10
    por sparker el 22-09-2008 22:06 UTC
  10. #10   jcarlosn@linux-wnp3:~/img2xhtml> time img2xhtml -f tux.jpg > /dev/null

    real 0m0.004s
    user 0m0.000s
    sys 0m0.002s

    jcarlosn@linux-wnp3:~/img2xhtml>

    Donde tu has tardado 0.04 (4 centesimas, te parece poco?) el código en C tarda 6 MILESIMAS.

    Vale, la diferencia es de: 0.04 frente a 0.006, lo que nos da un total de 6 veces mas, teniendo en cuenta que con operaciones mucho mas complejas, como he comentado de los cuadrados, la diferencia entre el C y el PHP se incrementa muchísimo...

    En una imagen grande, donde el C con lo que he comentado tarda 4 segundos, tu tardas 24, eso aun en el mejor de los casos, en el que el PHP no rinde peor que el C en algoritmo...  » ver todo el comentario
    votos: 0, karma: 9
    por jcarlosn el 22-09-2008 22:34 UTC
  11. #11   No #10, vamos a hacer las cosas bien.

    Veamos, probemos los dos programas en MI máquina (tu tienes un pedazo de maquinón, que nos conocemos ;) ).

    Además, he hecho un php que ejecute tu binario y muestre la salida.

    Medidos con wget:
    mi programa tarda 0.04s
    tu programa tarda 0.02s

    Sí, tienes razón, es más eficiente el programa creado en C++ (normal), pero no tanto como decias. Además, parsear una imagen tan grande como la que propones es la muerte para el navegador del cliente.

    Pero ¿por qué tantas cosas están hechas en PHP y no en C/C++? no es un capricho, es lo que señala #3 (ojo, que ni he probado si tu código funciona en plataformas diferentes a GNU/Linux, no tengo ninguna a mano).
    votos: 0, karma: 10
    por sparker el 22-09-2008 22:48 UTC
  12. #12   #11 0.02s y ni si quiera hemos entrado en operaciones complejas, eso solo refuerza mi teoría, aquí lo que retrasa todo el rato, es el PHP, que quiere decir esto? Lo siguiente:

    Tu código ha tardado 0.04s, todo el rato ha vivido en PHP, y eso es lo que ha tardado.

    Mi código ha tardado, en tu máquina y teniendo que pasar a través de tu PHP, 0.02s, mientras que en ninguna máquina superior a un pentium 4 tardaría eso, ni de broma, solo en ejecutarse el binario.

    Entonces, ahora imaginemos que extendemos el programa de forma compleja, en el cual, tu código vivirá siempre en el PHP, mientras que mi programa, sobre tu PHP, sufrirá la lentitud de PHP, entonces se ejecutará el binario, y volve...  » ver todo el comentario
    votos: 0, karma: 9
    por jcarlosn el 22-09-2008 22:58 UTC
  13. #13   Quiero aprovechar, ya que hemos entrado en el tema para citar algunas páginas sobre esto:

    dan.corlan.net/bench.html

    No voy a pastear el resultado del C optimizado ni del python +psyco, sino las cosas reales:

    C, gcc V2.95.4 3.61 3.57
    RUBY*** (interpreted) 1074.52
    Python** V2.1.2 (interpreted) 505.50
    Perl* V5.6.1 (bytecompiled) 515.04

    Mira que diferencias, donde C ha necesitado 3.61 segundos, Ruby ha necesitado 1074.52 segundos, te recomiendo que mires:

    shootout.alioth.debian.org/

    Una web muy buena sobre todo esto, con muchos datos y benchmarks.

    Por ejemplo:

    shootout.alioth.debian.org/u32q/benchmark.php?t...  » ver todo el comentario
    votos: 0, karma: 9
    por jcarlosn el 22-09-2008 23:12 UTC
  14. #14   En referencia a la PD de #10:

    Yo también defendía a C++ sobre Java (y lo sigo defendiendo), pero Java tiene muchos ases debajo de la manga.

    Mi jefe me hizo ver como un simple for (int i = 0; i < 9999999999; ++i) { int lol = i * i + 50000 + i; } es 7 veces más rápido en Java que en C++. No veas la cara que se me quedó (aún así, sigo defendiendo C++, simplemente por que Java me parece más bien un juguete en algunos aspectos, pero eso ya es carne de otro flame).

    Y en referencia a #12:

    Ambos coincidimos en que es más eficiente C++ que PHP, pero ten en cuenta el contexto: generar un html que a base de tags <a> construya una imagen.

    1. Si está en un servidor de imágenes...
    ...  » ver todo el comentario
    votos: 0, karma: 10
    por sparker el 22-09-2008 23:17 UTC
  15. #15   #14

    Mi jefe me hizo ver como un simple for (int i = 0; i < 9999999999; ++i) { int lol = i * i + 50000 + i; } es 7 veces más rápido en Java que en C++. No veas la cara que se me quedó (aún así, sigo defendiendo C++, simplemente por que Java me parece más bien un juguete en algunos aspectos, pero eso ya es carne de otro flame).

    Ahí hubo gato encerrado, mira:

    shootout.alioth.debian.org/u32q/benchmark.php?test=allp

    mandelbrot ~99 ~2.0 1.3

    G++ (el de la ~) es 99 veces mas rápido resolviendo mande...  » ver todo el comentario
    votos: 0, karma: 9
    por jcarlosn el 22-09-2008 23:22 UTC
  16. #16   #10 Existe algún lenguaje, en el que el lenguaje haga el manejo de memoria por ti (a diferencia de C/C++), válido para crear programas que trabajen con cantidades de datos ingentes? Estilo los pixeles de una foto gigante, y encima operar sobre ellos con bucles etc.

    Fácil. No hace falta que dejes C o C++, usa un recolector de basura (hay varias librerías). Además, en C++ tienes los punteros inteligentes.

    Si quieres usar el programa para imágenes grandes, hay sitios del código donde podrías optimizarlo, como por ejemplo las iteraciones de los bucles (a simple vista) no tienen dependencias entre sí. Pasarlo a un algoritmo del estilo "divide y vencerás" para paralelizarlo sería relativamente trivial.

    Por otra parte, ¿la libjpeg no tiene nada como mmap()? Lo digo por lo de tener que escanear línea por línea.
    votos: 0, karma: 6
    por esteve.fernandez el 23-09-2008 07:19 UTC
  17. #17   #16 No has entendido la pregunta, estaba en un contexto, en el que la duda no es:

    "Puedo usar C/C++ sin encargarme yo de la memoria?"

    Sino:

    "Se puede usar realmente un lenguaje donde la gestión de memoria la haga un interprete (o una capa intermedia), para problemas complejos sobre volúmenes ingentes de datos?"

    Eso te pasa por entrar al flame corriendo y sin leer :p
    votos: 0, karma: 9
    por jcarlosn el 23-09-2008 08:47 UTC
  18. #18   #17 Eso te pasa por entrar al flame corriendo y sin leer

    ¿Qué flame? De verdad, deberías dejar de tomarte las cosas tan a la defensiva, saltas a la primera :-(

    En fin, a la reformulación de la pregunta, te puedo asegurar que sí. De hecho es beneficioso, ¿porqué? Pues porque si creas y destruyes la memoria al momento, tu programa irá más lento (malloc/free y new/delete tienen un coste). Cualquier programa que tenga que estar ejecutándose por largos periodos y que trabaje con muchos datos se verá beneficiado de varias técnicas (pool de memoria, destrucción de objetos demorada, mallocs especializados, etc.)
    votos: 0, karma: 6
    por esteve.fernandez el 23-09-2008 10:58 UTC
  19. #19   #18 lo de flame lo decía en broma hombre.

    Acerca de lo que dices...no estoy de acuerdo.

    Cuando tienes un lenguaje abstraido, tienes una capa entre tu y la memoria, es una capa genérica, y que tiene un coste, sin embargo, tu propones que es mejor, pero argumentas cuestiones relativas a la implementación.

    En primer lugar, cualquier técnica que utilice PHP, el cual está hecho en C, la puedes utilizar tu también en tu programa en C, y con una capa de abstracción menos, lo cual siempre se nota (mira las gráficas que puse mas arriba)

    En segundo lugar, de que sirve la destrucción de objetos demorada? toda la memoria que pides, la ha de liberar, sea ahora, o dentro de un rato.

    Acerca del pool de memoria, no lo veo claro para una imagen, respecto al impacto que tiene en el consumo de memoria total.
    votos: 0, karma: 9
    por jcarlosn el 23-09-2008 13:42 UTC
  20. #20   Joer, que comentarios más majos :)

    Digo yo, que para grandes volúmenes de datos, además de la gestión de memoria que comentáis, paralelizar también ayudaría, ¿no?, tipo erlang (aunque hablo de oídas, también 'he oído' que la complejidad puede hacerse difícil de manejar si no se lleva cuidado).
    votos: 0, karma: 7
    por maeghith el 23-09-2008 14:48 UTC
  21. #21   #19 Parece que te he malinterpretado, será que la lluvia me hace estar más susceptible, como se cargue la Mercè...

    Cuando tienes un lenguaje abstraido, tienes una capa entre tu y la memoria, es una capa genérica, y que tiene un coste, sin embargo, tu propones que es mejor, pero argumentas cuestiones relativas a la implementación.

    Hablaba de la manera de gestionar la memoria en C y C++ porque era de los lenguajes de los que estábamos hablando. Aún así, manejar la memoria "a mano" no siempre es eficiente:

    en.wikipedia.org/wiki/Memory_pool

    En primer lugar, cualquier técnica que _uti...  » ver todo el comentario
    votos: 0, karma: 6
    por esteve.fernandez el 23-09-2008 15:54 UTC
comentarios cerrados

menéame