背景,我正在将图像转换为ASCII艺术。这可以完美工作,甚至可以使用24位颜色,将颜色转换为正确的rgb值。但是,我现在想以4位调色板而不是24位来渲染ascii艺术。
如何使用PHP将24位颜色转换为4位?
更具体地说,我有标准的IRC颜色托盘,我需要将任何给定的十六进制或RGB值转换为该颜色。当转换为4位颜色时,颜色最好尽可能匹配。
我对此的其他想法是在尝试从中获取颜色之前,将图像本身转换为4位调色板(使用GD,这是我现在用来读取颜色的颜色)。另一个想法可能是为以下每种颜色定义一个颜色范围,然后仅检查给定的24位颜色是否在该范围内,但是我不知道如何将所有颜色的范围都放入该调色板中。
最后,尽管围绕着imagemagick提出了很好的建议,但我还是使用了直接的php找到了一个很好的解决方案。我能够通过使用Delta E 2000和在github上找到的php-color-difference库的修改版本来计算最接近的颜色,这是我的叉子:https : //github.com/nalipaz/php-color-difference
相关示例是:
<?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];
我对这种解决方案和较少的开销感到非常满意。谢谢你们的建议。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句