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
 

AnrDaemon

Продвинутый новичок
1. Ты определись, srand() или mt_rand()
2. У тебя не RGB картинка - так что цвета будут те, что прописаны в палитре.
 

daslex

Новичок
С генерацией значений всё правильно. mt_rand() Я не понял этого замечания.

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

Смысл прост. Нужно создать вторую картинку, которая imagecreatetruecolor, в неё скопировать загруженную для фона и уже именно на эту вторую картинку (с полноценной палитрой) накладывать создаваемый рисунок.
3.jpg
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
чем возиться с палитрами - проще работать с 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.
 

daslex

Новичок
Чего ко мне со srand пристали?
начиная с PHP 4.2.0, больше не нужно сеять генератор случайных чисел, перед тем как его использовать.

У меня получилось копированием. Если отбросить выбор расширения, то при чём тут шипение модемов? Они также будут шипеть, как и в другом случае.
 

daslex

Новичок
чем возиться с палитрами - проще работать с 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);

Только не на квадратах, а на тексте, русский текст превратился в квадраты.
В предложенном мной способе русский текст отображается русским текстом.
 

AnrDaemon

Продвинутый новичок
Какая связь между форматами изображения и вашей неспособностью работать с кодировками текста?
 

daslex

Новичок
При чём тут моя неспособность работать с кодировкой текста? У меня с кодировкой всё в порядке. Иначе бы в обоих вариантах было проблемой. А так, только в одном.
 

daslex

Новичок
PHP:
$img = imagecreatetruecolor($x,$y); //Всё прекрасно

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

imagepalettetotruecolor($img); //Санкции на русские символы
При чём тут мои умения работы с кодировками?
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
Нормальный код приведи. Который можно исполнить и посмотреть на результаты.
 

daslex

Новичок
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
 
Последнее редактирование:

daslex

Новичок
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

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