Мне нужен скрипт, который делает закругленные прозрачные углы на изображении. Я нашел один, и он работает хорошо, за исключением одного: нанесенные углы не выглядят гладкими. imageantialias()
выдает фатальную ошибку, поскольку PHP работает на Debian, и его повторная компиляция невозможна.
Уловка, которую я нашел, чтобы эти углы выглядели гладкими, заключается в изменении размера изображения с помощью _2 _ следующим образом:
- подготовить изображение;
- imagecopyresample до 10-кратного размера;
- углы прорисовываем особым цветом;
- сделайте этот цвет прозрачным;
- уменьшить изображение до исходного размера
Но здесь возникает проблема: углы результирующего изображения (после шага 5) гладкие, но не прозрачные < / а>. При отправке на вывод изображения после шага 4 (т.е. перед уменьшением его размера) - все в порядке как и должно быть.
Вот часть кода, отвечающая за скругление углов:
// $dest = image resource $q=10; // making everything 10x bigger $new_width=$width*$q; $new_height=$height*$q; $radius=$radius*$q; $magnified=imagecreatetruecolor($new_width, $new_height); imagecopyresampled($magnified, $dest, 0,0, 0,0, $new_width,$new_height, ($new_width/$q),($new_height/$q)); // picking the unique colour $found = false; while($found == false) { $r = rand(0, 255); $g = rand(0, 255); $b = rand(0, 255); if(imagecolorexact($magnified, $r, $g, $b) != (-1)) { $found = true; } } $colorcode = imagecolorallocate($magnified, $r, $g, $b); // drawing corners imagearc($magnified, $radius-1, $radius-1, $radius*2, $radius*2, 180, 270, $colorcode); imagefilltoborder($magnified, 0, 0, $colorcode, $colorcode); imagearc($magnified, $new_width-$radius, $radius-1, $radius*2, $radius*2, 270, 0, $colorcode); imagefilltoborder($magnified, $new_width-1, 0, $colorcode, $colorcode); imagearc($magnified, $radius-1, $new_height-$radius, $radius*2, $radius*2, 90, 180, $colorcode); imagefilltoborder($magnified, 0, $new_height-1, $colorcode, $colorcode); imagearc($magnified, $new_width-$radius, $new_height-$radius, $radius*2, $radius*2, 0, 90, $colorcode); imagefilltoborder($magnified, $new_width-1, $new_height-1, $colorcode, $colorcode); // making the unique colour transparent imagecolortransparent($magnified, $colorcode); // scaling down the enlarged image to it's original size // expecting corners to remain transparent imagecopyresampled($dest, $magnified, 0,0, 0,0, ($new_width/$q),($new_height/$q), $new_width,$new_height); // but they're not // sending $magnified to output for testing purposes $dest=$magnified; // outputting $dest as image/png
Итак, как видите, проблема возникает, когда увеличенное изображение копируется в исходный размер. Прозрачные углы заполняются цветом $colorcode
. Я играл с imagesavealpha()
и _ 5_ как рекомендуется, но безрезультатно.
Пожалуйста, помогите мне сделать эту работу.
P.S. Это может быть полезно: при загрузке большого PNG на imgur.com он был преобразован в JPG, и, как вы можете видеть, все углы были заполнены этим очень восстановленным $ цветовой код.
P.S. Надеюсь, меня не забанят за чрезмерное употребление слова «расширение» :)
$magnified=imagecreatetruecolor($new_width, $new_height);
. Вы можете выйти за пределы памяти (или ограничения, которые вы установили в php.ini). - person Wh1T3h4Ck5   schedule 24.04.2011imageantialias()
фатальную ошибку перед трюками с размером образа, так что я уверен, что это проблема Debian. - person aexl   schedule 24.04.2011