Как я могу заставить предопределенную цветовую палитру на изображение с помощью PHP? - PullRequest
2 голосов
/ 06 июля 2011

Я хочу сделать снимок и уменьшить цветовую палитру до предустановленной палитры.Я хочу попробовать чистый черный и белый, 16 цветов, 64 цвета и так далее.

Я не могу использовать imagetruecolortopalette(), потому что он строит палитру на основе цветов изображения, тогда как я хочу использовать предопределенную палитру.Я также не могу просто сделать его в градациях серого, а затем раскрасить его, потому что это означало бы, что я потерял все исходные цвета, а полученное изображение все равно было бы только одного цвета.

1 Ответ

0 голосов
/ 28 июня 2012

Я видел эту функцию в комментариях к функции php на днях, которые бы помогли вам.Все, что вам нужно сделать, это создать массив цветов, которые вы хотите в своем «новом» изображении, и передать ему старый.

$arr = array('#000000', '#990000', '#00FFFF', '#FFFFDD');
colorize ($img, $arr);

<?php
function colorize($imgdata, $palette)
{
    imageTrueColorToPalette($imgdata,false,0xFF);
    $l = count($palette)-1;
    $i = imagecolorstotal($imgdata);
    while ($i--)
    {
    list($r,$g,$b) = array_values(imageColorsForIndex($imgdata,$i));

    $grayscale = ($r*.3 + $g*.59 +$b*.11) / 0xFF;

    $pos = $l*$grayscale;

    $perc = $pos-floor($pos);

    $tbase = str_replace("#", '', $palette[$pos]);
    $baseR = hexdec(substr($tbase,0,2));
    $baseG = hexdec(substr($tbase,2,2));
    $baseB = hexdec(substr($tbase,4,2));

    $tmix = str_replace("#", '', $palette[$pos+1]);
    $mixR = hexdec(substr($tmix,0,2));
    $mixG = hexdec(substr($tmix,2,2));
    $mixB = hexdec(substr($tmix,4,2));

    $resR = $baseR+($mixR-$baseR)*$perc;
    $resG = $baseG+($mixG-$baseG)*$perc;
    $resB = $baseB+($mixB-$baseB)*$perc;

    imagecolorset($imgdata, $i, $resR, $resG, $resB);
    }
}
?>
...