шкалик средствами gd

932
.
Koenig
(\/)____o_O____(\/)
написал динамический шкалик, работает как функция
function koescale($percent) {
// тут процент получаем и фильтруем
if ($percent && $percent > 0 && $percent<101) {
$percent = intval($percent); 
} else {
die('ПНХ'); 
}

// тут первый квадратик
$img_one = imagecreatetruecolor(100, 20);
$color_one = imagecolorallocate($img_one, 0, 0, 0);
imagefilledrectangle ($img_one, 0, 0, 100, 20, $color_one);

// тут второй квадратик
$img_two = imagecreatetruecolor($percent, 20);
$color_two = imagecolorallocate($img_two, 255, 255, 255);
imagefilledrectangle ($img_two, 0, 0, $percent, 20, $color_two);

// второй квадратик зависит от процента из GET
// накладываем квадратики с прозрачностью
imagecopymerge($img_one, $img_two, 0, 0, 0, 0, 100, 20, 25);

// создаем прозрачный квадратик и пишем на нем цифру
$print_percent = imagecreatetruecolor(100, 20);
$white = imagecolorallocate($print_percent, 0, 0, 0);
$red = imagecolorallocate($print_percent, 255, 0, 0);
imagecolortransparent($print_percent, $white); 
imagestring($print_percent, 12, 40, 2, $percent . '%', $red); 

// накладываемцифру на квадратики
imagecopymerge($img_one, $print_percent, 0, 0, 0, 0, 100, 20, 100);

// рисуем результат
imagegif($img_one, 'tmp.gif');
$fil = file_get_contents('tmp.gif');
unlink('tmp.gif');
imagedestroy($img_one);
imagedestroy($img_two);
imagedestroy($print_percent);

return '<img width="100" height="20" src="data:image/gif;base64,' . chunk_split(base64_encode($fil)) . '" alt="koescale" />';
}
картинка 100 на 20 , пример работы
echo 'сила';
echo '<br/>';
echo koescale(56) ;
echo '<br/>';
echo 'ловкость';
echo '<br/>';
echo koescale(76) ;
echo '<br/>';
echo 'дух';
echo '<br/>';
echo koescale(46) ;
echo '<br/>';
echo 'разум';
echo '<br/>';
echo koescale(26) ;
echo '<br/>';
.
Зачётно получилось
.
Let Mortal Kombat begin
лучше код запостить сюда
.
Я бы всю эту красоту сделал бы на css, так как считаю что использование gd в случаи со шкаликами не рационально + лишние запросы к серверу. имхо
.
(\/)____o_O____(\/)
нет там чего то, такого тяжелого, так как более менее знаю пых, пишу на нем, иногда интересные быдловелосипеды получаются, особенно мне вывод нравиться, можно лепить несколько картинок сразу, хотя вариант с отдельным файлом я тоже сделал, и передавал ему параметр, как это сделанно повсеместно, например с капчёй, цвета тоже можно менять, там не сложно догадаться где, плюс может подровнять
.
(\/)____o_O____(\/)
еще одна фишка с gd
может кому пригодиться, писал для пятнашек, которые в итоге превратились в puzzle (мазайка)

function koecrushimage($imgfile, $sidepart=4) {

$root = realpath(dirname(__FILE__)) . DIRECTORY_SEPARATOR;
    
$dir = 'img';

$crushdir = 'crush';

if (!is_dir($root . $dir))
mkdir($root . $dir, 0777, true);

if (!is_dir($root . $dir . DIRECTORY_SEPARATOR . $crushdir))
mkdir($root . $dir . DIRECTORY_SEPARATOR . $crushdir, 0777, true);

$parts = pow($sidepart, 2);

if (!is_dir($root . $dir . DIRECTORY_SEPARATOR . $crushdir . DIRECTORY_SEPARATOR . substr($imgfile, 0, -4) . DIRECTORY_SEPARATOR . $parts))
mkdir($root . $dir . DIRECTORY_SEPARATOR . $crushdir . DIRECTORY_SEPARATOR . substr($imgfile, 0, -4) . DIRECTORY_SEPARATOR . $parts, 0777, true);

$img = imagecreatefromjpeg($root . $dir . DIRECTORY_SEPARATOR . $imgfile); 
$x = imagesx($img);
$y = imagesy($img);
$newx = (intval($x/$sidepart))*$sidepart;
$newy = (intval($y/$sidepart))*$sidepart;
$newimg = imagecreatetruecolor($newx, $newy);
imagefill($newimg, 0, 0, 0x000000);
imagecopyresampled($newimg, $img, 0, 0, 0, 0, $x, $y, $newx, $newy);
$picx = $newx/$sidepart;
$picy = $newy/$sidepart;
 
for ($i=0, $gorizontal=0; $i<$parts; $i++) {
$newpic = imagecreatetruecolor($picx, $picy);
imagefill($newpic, 0, 0, 0x000000); 
if ((($i%$sidepart)==0) && ($i!=0)) {
$gorizontal++; 
}
$vertical = ($i!=0) ? ($i%$sidepart) : $i;
imagecopyresampled($newpic, $newimg, 0, 0, ($vertical*$picx), ($gorizontal*$picy), $picx, $picy, $picx, $picy); 
imagejpeg($newpic, $root . $dir . DIRECTORY_SEPARATOR . $crushdir . DIRECTORY_SEPARATOR . substr($imgfile, 0, -4) . DIRECTORY_SEPARATOR . $parts . DIRECTORY_SEPARATOR . 'pic' . ($i+1) . '.jpg', 25);
imagedestroy($newpic);
}
screen($parts, $dir . DIRECTORY_SEPARATOR . $crushdir . DIRECTORY_SEPARATOR . substr($imgfile, 0, -4) . DIRECTORY_SEPARATOR . $parts);
}

function screen($parts, $dir) {
echo '<table><tr>' . PHP_EOL;
for ($i=1;$i<=$parts;$i++) {
echo '<td>' . PHP_EOL; 
echo '<img src="' . $dir . DIRECTORY_SEPARATOR . 'pic' . $i . '.jpg" alt="' . $i . '" />' . PHP_EOL;
echo '</td>' . PHP_EOL;
if (($i%(sqrt($parts))==0) && ($i!=0)){
echo '</tr><tr>' . PHP_EOL; 
} 
}
echo '</tr></table>' . PHP_EOL;
}

koecrushimage('test.jpg', 10);

рядом с файлом создать папку img, в нее положить файл картинки *.jpg
имя картинки передать в функцию, второй параметр не обязательный, пилит картинку на кучу квадратиков
архив на всякий случай
Прикрепленные файлы:
.
(\/)____o_O____(\/)
скрин
Прикрепленные файлы:
.
Это можно сайт сделать, типа собери картинку..ну и баллы.
.
Даже можно такое включить в этап прохождения игры, как логический ключ к чему нибудь, например на картинке буит подсказка и т.д..
.
(\/)____o_O____(\/)
ну пузлы работают уже давно у меня на хомяке, еще самый первый вариант, уже переписал на ооп, кода в два раза меньше получилось, изначально это были пятнашки, может кто помнит такую карманную игру, потом просто цифры стали куском картинки, один элемент двигать, я его просто зеленым кубиком сделал
Всего: 36