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 ImageMagick (o GraphicsMagick) puede hacer esto con la opción -depth. Hay una discusión de esto aquí: http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=15395
ACTUALIZACIÓN: Debo añadir que ImageMagick no es una biblioteca PHP, sin embargo, hay un contenedor PECL (imagick) en http://pecl.php.net/package/imagick .
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.