Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

str2gradient - преобразование строки в градиент-аналог (Илья Л.)
Author Message
Илья Л.
Заглянувший



Joined: 20 Jan 2008
Posts: 1
Карма: 0
   поощрить/наказать


PostPosted: Tue Jan 22, 2008 6:15 am (написано за 3 минуты 30 секунд)
   Post subject: str2gradient - преобразование строки в градиент-аналог
Reply with quote

Значит понадобилась мне простенькая реализация данного вопроса, вразумительного мало нашёл
авось пригодится кому-нибудь. Функция естественно ещё до идеала не до ведена, но всё же пользоваться можно
Code (php): скопировать код в буфер обмена
<?php
/*
*
* Преобразовывает строку $text в строку-градиент
* начиная с цвета $from и заканчивая цветом $to
* Поддерживает работу как и с rgb режимом так и с hex
*
* @param    string  $text - сама строка
* @param    string  $from - начальный цвет
* @param    string  $to   - Конечный цвет
* @param    string  $mode - Режим, по умолчанию hex
*/

function str2gradient($text,$from='',$to='', $mode="hex")
{
    if($mode=="hex")
    {
        $to  = hexdec (www.php.net/hexdec)($to[0].$to[1]).",".hexdec($to[2].$to[3]).",".hexdec($to[4].$to[5]);
        $from= hexdec (www.php.net/hexdec)($from[0].$from[1]).",".hexdec($from[2].$from[3]).",".hexdec($from[4].$from[5]);
    }

    if( empty (www.php.net/empty)($text) )
        return '';
    else
        $levels=strlen (www.php.net/strlen)($text);

    if (empty (www.php.net/empty)($from))
                $from = array (www.php.net/array)(0,0,255);
    else
                $from = explode (www.php.net/explode)(",", $from);

    if (empty (www.php.net/empty)($to))

                $to = array (www.php.net/array)(255,0,0);
    else
                $to = explode (www.php.net/explode)(",", $to);

        $output = "";

        for ($i=1;$i<=$levels;$i++)
        {
                for ($ii=0;$ii<3;$ii++)
                {
                        $tmp[$ii] = $from[$ii] - $to[$ii];
                        $tmp[$ii] = floor (www.php.net/floor)($tmp[$ii] / $levels);
                        $rgb[$ii] = $from[$ii] - ($tmp[$ii] * $i);

                        if ($rgb[$ii] > 255) $rgb[$ii] = 255;

                        $rgb[$ii] = dechex (www.php.net/dechex)($rgb[$ii]);
                        $rgb[$ii] = strtoupper (www.php.net/strtoupper)($rgb[$ii]);

                        if (strlen (www.php.net/strlen)($rgb[$ii]) < 2) $rgb[$ii] = "0$rgb[$ii]";
                }
            $output .= "<font color=\"#".$rgb[0].$rgb[1].$rgb[2]."\">" . $text[$i -1 ] . "</font>";
        }
        return $output."\n";
}
?>
Пример использования:
Code (php): скопировать код в буфер обмена
<?php
include("str2gradient.php");
echo (www.php.net/echo) str2gradient(",  !", "FF0000", "FFCC00");
echo (www.php.net/echo) "<hr />\n";
echo (www.php.net/echo) str2gradient(",     rgb!", "255,255,0", "150,150,0", "rgb");
?>
Сегодня-завтра сделаю функцию по умней, но, повторюсь, пользоваться ей можно уже и сейчас :)
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Fri Feb 15, 2008 10:44 pm (спустя 24 дня 16 часов 29 минут; написано за 39 секунд)
   Post subject:
Reply with quote

мое очередное баловство на досуге:
Code (php): скопировать код в буфер обмена
        function gradient($txt, $from=0x000000, $to=0xffffff)
        {
                // count of all characters
                $strlen = strlen (www.php.net/strlen)($txt);

                // count of nonblank characters
                $grdlen = $strlen - preg_match_all (www.php.net/preg_match_all)('/\s/', $txt, $null) - 1;

                // skip a colorizing of whitespace line
                if ( ! $grdlen ) {
                        return $txt;
                }

                // skip a single coloring
                if ( $from == $to ) {
                        return sprintf (www.php.net/sprintf)('<span style="color: #%06x">%s</span>', $from, $txt);
                }

                // represent the start and the end colors as arrays
                $f = array (www.php.net/array)(
                        floor (www.php.net/floor)($from / 0x10000),
                        floor (www.php.net/floor)(($from & 0xffff) / 0x100),
                        $from & 0xff,
                );
                $t = array (www.php.net/array)(
                        floor (www.php.net/floor)($to / 0x10000),
                        floor (www.php.net/floor)(($to & 0xffff) / 0x100),
                        $to & 0xff,
                );

                // current value of red, green and blue colors separately
                $r = $f[0];
                $g = $f[1];
                $b = $f[2];

                // deltas per each color
                $rd = ($t[0] - $f[0]) / $grdlen;
                $gd = ($t[1] - $f[1]) / $grdlen;
                $bd = ($t[2] - $f[2]) / $grdlen;

                $result = '';
                for ($i = 0; $i < $strlen; $i++) {
                        // skip colorizing of whitespaces
                        if ( preg_match (www.php.net/preg_match)('/\s/', $txt{$i}) ) {
                                $result .= $txt{$i};
                                continue;
                        }

                        // colorize one character
                        $result .= sprintf (www.php.net/sprintf)('<span style="color: #%02x%02x%02x">%s</span>', $r, $g, $b, $txt{$i});

                        // next color
                        $r += $rd;
                        $g += $gd;
                        $b += $bd;
                }

                return $result;
        }
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Thu Feb 21, 2008 9:49 pm (спустя 5 дней 23 часа 4 минуты)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «преобразование строки в градиент (обсуждение)»,
расположенную в форуме Разное :: PHP (21 Февраля 2008, 21:49).
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML