with texto strip_tags remove limpiar from especiales eliminar convertir caracteres allow all php colors gd

php - texto - remove html tags from string



PHP convierte colores de 24 bits a 4 bits (4)

imagetruecolortopalette te permite reducir los colores, pero los resultados pueden variar mucho y no sé si hay una forma de ''mapear'' correctamente los colores o especificar la paleta.

Imagen de prueba (24 bits):

Reducido a 4 bits (sin dithering):

$img = imagecreatefrompng(''Bliss.png''); imagetruecolortopalette($img, false, 16); imagepng($img, ''Bliss2.png'');

Reducido a 4 bits (con difuminado):

$img = imagecreatefrompng(''Bliss.png''); imagetruecolortopalette($img, true, 16); imagepng($img, ''Bliss3.png'');

Como puede ver, los resultados están lejos de ser perfectos. Pero quizás este es un buen comienzo para ti.

Antecedentes, estoy convirtiendo imágenes en arte ascii. Esto funciona perfectamente e incluso funciona con color de 24 bits, convirtiendo los colores a los valores de rgb correctos. Sin embargo, ahora quiero renderizar el arte ascii en una paleta de colores de 4 bits en lugar de en 24 bits.

¿Cómo convierto colores de 24 bits a 4 bits con PHP?

Más específicamente, tengo la paleta de colores IRC estándar a la que necesito convertir cualquier valor hexadecimal o RGB dado. Se prefiere que los colores coincidan lo mejor posible cuando se convierten al color de 4 bits.

Otras ideas que he tenido sobre esto son convertir la imagen en una paleta de 4 bits (usando GD, que es lo que uso para leer en los colores en este momento) antes de tratar de sacar colores de ella. Y otra idea podría ser definir un rango de color para cada uno de los siguientes colores y simplemente verificar que el color dado de 24 bits esté en el rango, sin embargo, no sabría cómo obtener los rangos para todos los colores en esa paleta.



Creo que debes usar remap para asignar los colores de la imagen a la paleta de colores en tu muestra. Lo hago en la línea de comandos de esta manera:

convert image.jpg -remap palette.jpg out.jpg

Puede o no desear la opción de dither : compruébalo.

La imagen original está aquí:

y esta es mi palette.jpg (solo necesitas una imagen realmente pequeña, esta es demasiado grande, palette.jpg esto en breve)

y el resultado

También puede crear su paleta según los colores que desee utilizando ImageMagick. Codifiqué manualmente lo siguiente y no presté demasiada atención, por lo que querría verificar los valores RGB aquí antes de asumir que son correctos:

#/bin/bash cat<<EOF | convert txt:- palette.png # ImageMagick pixel enumeration: 8,2,256,rgb 0,0: (255,255,255) 1,0: (0,0,0) 2,0: (0,0,255) 3,0: (255,255,0) 4,0: (255,0,0) 5,0: (128,128,128) 6,0: (255,105,180) 7,0: (173,216,230) 0,1: (50,205,50) 1,1: (139,0,0) 2,1: (255,165,0) 3,1: (128,0,128) 4,1: (0,0,139) 5,1: (0,128,128) 6,1: (0,128,0) 7,1: (211,211,211) EOF

Básicamente, el script anterior le da a ImageMagick los valores RGB como texto y le pide que cree una pequeña imagen de 8x2 que se vea así:

Luego usaría esta paleta con su operación de remap .


Al final, a pesar de las maravillosas sugerencias sobre imagemagick, encontré una buena solución con php directo. Pude calcular el color más cercano mediante el uso de delta E 2000 con una versión modificada de la biblioteca php-color-difference que se encuentra en github, aquí está mi fork: https://github.com/nalipaz/php-color-difference

El ejemplo pertinente es:

<?php include(''lib/color_difference.class.php''); $palette = array( ''00'' => array(255, 255, 255), ''01'' => array(0, 0, 0), ''02'' => array(0, 0, 139), ''03'' => array(0, 128, 0), ''04'' => array(255, 0, 0), ''05'' => array(139, 0, 0), ''06'' => array(128, 0, 128), ''07'' => array(255, 165, 0), ''08'' => array(255, 255, 0), ''09'' => array(50, 205, 50), ''10'' => array(0, 128, 128), ''11'' => array(173, 216, 230), ''12'' => array(0, 0, 255), ''13'' => array(255, 105, 180), ''14'' => array(128, 128, 128), ''15'' => array(211, 211, 211), ); $color_rgb = array(255, 255, 128); $color_delta_e = new color_difference($color_rgb); $match_index = $color_delta_e->getClosestMatch($palette); $color = $palette[$match_index];

Estoy muy contento con esta solución y con una menor cantidad de gastos generales. Gracias por las sugerencias chicos.