gd library, закрашенные фигуры наложить на загруженную картинку

daslex

Новичок
Предполагалось, что будут цвета только красный, зелёный или синий со случайно выбранной яркостью, на простой фон в виде закрашенной фигуры закрашенные фигуры рисуются правильным цветом, а если накладывать на загруженную картинку, цвета странно смешиваются.
PHP:
<?php
function rndrgb($img,$color,$min,$max){
    srand();
        $rnd = mt_rand(150,255);
        switch ($color){
            case "red":   return imagecolorallocate($img,mt_rand($min,$max)+0,0,0);
            case "green": return imagecolorallocate($img,0, mt_rand($min,$max)+0,0);
            case "blue":  return imagecolorallocate($img,0,0,mt_rand($min,$max)+0);
        }
    }   
/*ЗАДАНИЕ ЗНАЧЕНИЙ И КОНСТАНТ*/
define("mincolor",0);
define("maxcolor",255);
$color_arr= [
    "red",
    "green",
    "blue",
];
$str_arr = ["OPOP","dsfs","sdhhhhhh","aaaa"];
$x = 10;    $y = 10;    $dx = 10;   $dy = 10;
$img = imagecreatefromgif("pic.gif"); //Тут капризы
//$img = imagecreatetruecolor(560,80);
//imagefilledrectangle($img,0,0,560,80,imagecolorallocate($img,192,192,192)); //Если так, то будет правильно
$color = imagecolorallocate($img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
/*КОНЕЦ ЗАДАНИЙ ЗНАЧЕНИЙ И КОНСТАНТ*/
shuffle($color_arr);
imageantialias($img,true);
   
foreach ($str_arr AS $key=>$value){
    for ($j=0;$j<strlen($value);$j++){
       
        $color = $color_arr[$key % count($color_arr)];
               
            $rgb =  rndrgb($img,$color,mincolor,maxcolor);
       
        imagefilledrectangle($img,$x,$y,$x+$dx,$y+$dy,$rgb);
        $x+=20;
    }
    $x+=20;
}
       
header("Content-Type: image/gif");
imageGif($img);
imagedestroy($img);
   
?>

На фон в виде закрашенного прямоугольника закрашенные квадраты наложились верными цветами2.jpg

На загруженную картинку фона закрашенные квадраты появились неправильными цветами (жёлтого цвета код вообще не предполагает)
1.jpg
 
1. Ты определись, srand() или mt_rand()
2. У тебя не RGB картинка - так что цвета будут те, что прописаны в палитре.
 
С генерацией значений всё правильно. mt_rand() Я не понял этого замечания.

Спасибо. Я понял про RGB и получилось.

Смысл прост. Нужно создать вторую картинку, которая imagecreatetruecolor, в неё скопировать загруженную для фона и уже именно на эту вторую картинку (с полноценной палитрой) накладывать создаваемый рисунок.
3.jpg
 
Последнее редактирование:
чем возиться с палитрами - проще работать с true color, гифку http://php.net/manual/en/function.imagepalettetotruecolor.php и отдавать нормальный png.

Можно повозиться с imagecolorsforindex и далее, но вроде 256-цветовых видеорежимов нет со времен этак windows 3.11, да и как модем шипит, мало кто помнит.
mt_rand() Я не понял этого замечания
либо srand() + rand(), либо mt_srand() + mt_rand(); ну и вообще Note: There is no need to seed the random number generator with srand() or mt_srand() as this is done automatically.
 
Чего ко мне со srand пристали?
начиная с PHP 4.2.0, больше не нужно сеять генератор случайных чисел, перед тем как его использовать.

У меня получилось копированием. Если отбросить выбор расширения, то при чём тут шипение модемов? Они также будут шипеть, как и в другом случае.
 
чем возиться с палитрами - проще работать с true color, гифку http://php.net/manual/en/function.imagepalettetotruecolor.php и отдавать нормальный png.

Можно повозиться с imagecolorsforindex и далее, но вроде 256-цветовых видеорежимов нет со времен этак windows 3.11, да и как модем шипит, мало кто помнит. либо srand() + rand(), либо mt_srand() + mt_rand(); ну и вообще Note: There is no need to seed the random number generator with srand() or mt_srand() as this is done automatically.
Я попробовал
$img = imagecreatefromgif($filename);
imagepalettetotruecolor($img);

Только не на квадратах, а на тексте, русский текст превратился в квадраты.
В предложенном мной способе русский текст отображается русским текстом.
 
Какая связь между форматами изображения и вашей неспособностью работать с кодировками текста?
 
При чём тут моя неспособность работать с кодировкой текста? У меня с кодировкой всё в порядке. Иначе бы в обоих вариантах было проблемой. А так, только в одном.
 
PHP:
$img = imagecreatetruecolor($x,$y); //Всё прекрасно

велокопирование ;//Всё прекрасно

imagepalettetotruecolor($img); //Санкции на русские символы

При чём тут мои умения работы с кодировками?
 
Последнее редактирование:
Нормальный код приведи. Который можно исполнить и посмотреть на результаты.
 
1.
PHP:
<?php
define("font","../fonts/arial.ttf");
$str_arr = ["Самолёт","ЛЕТЕЛ","высоко","высоко"];
$img = imagecreatetruecolor(560,160);

$x=20;$y=30;
foreach ($str_arr AS $key=>$value){
    for ($j=0;$j<mb_strlen($value);$j++){
           $char = mb_substr($value,$j,1);
            $rgb =  imagecolorallocate($img,mt_rand(100,255),mt_rand(100,255),mt_rand(100,255));
           imagettftext ($img, 18, 0, $x, $y, $rgb, font, $char);
           $x+=15;
   }
   $x+=15;
} 

header("Content-Type: image/gif");
imageGif($img);
?>
1.gif
2.
PHP:
<?php
define("font","../fonts/arial.ttf");
define("filename","1.gif");
$str_arr = ["Самолёт","ЛЕТЕЛ","высоко","высоко"];
$img = imagecreatefromgif(filename);
imagepalettetotruecolor($img); //<---- Привет! Я съем твой русский!

$x=20;$y=30;
foreach ($str_arr AS $key=>$value){
    for ($j=0;$j<mb_strlen($value);$j++){
           $char = mb_substr($value,$j,1);
            $rgb =  imagecolorallocate($img,mt_rand(10,255),mt_rand(10,255),mt_rand(10,255));
           imagettftext ($img, 18, 0, $x, $y+50, $rgb, font, $char);
           $x+=15;
   }
   $x+=15;
} 

header("Content-Type: image/gif");
imageGif($img);
?>
2.gif
 
Последнее редактирование:
3.
PHP:
<?php
define("font","../fonts/arial.ttf");
define("filename","1.gif");
$str_arr = ["Самолёт","ЛЕТЕЛ","высоко","высоко"];
$img = imagecreatefromgif(filename);
$img2 = imagecreatetruecolor(560,160);
imagecopy ( $img2 , $img ,0 , 0 , 0 , 0 , 560 , 160 );


$x=20;$y=30;
foreach ($str_arr AS $key=>$value){
    for ($j=0;$j<mb_strlen($value);$j++){
           $char = mb_substr($value,$j,1);
            $rgb =  imagecolorallocate($img2,mt_rand(10,255),mt_rand(10,255),mt_rand(10,255));
           imagettftext ($img2, 18, 0, $x, $y+50, $rgb, font, $char);
           $x+=15;
   }
   $x+=15;
}  

header("Content-Type: image/gif");
imageGif($img2);
?>
3.gif

Путь к шрифту и сам рисунок для загрузки уж сами пропИшете.
 
Последнее редактирование:
Сверху