Мне нужен script, который создает округлые прозрачные углы на поставляемом изображении. Я нашел один, и он работает хорошо, за исключением одного: применяемые углы не выглядят гладкими. imageantialias() выдает Fatal Error с PHP работает на Debian и повторная компиляция не является вариантом.
Трюк, который я нашел, чтобы заставить эти углы выглядеть гладкими, изменяет размер изображения с помощью imagecopyresampled() следующим образом:
- подготовить изображение;
- imagecopyresample до размера 10x;
- рисовать углы со специальным цветом;
- сделать этот цвет прозрачным;
- уменьшить изображение до его первоначального размера
Но здесь возникает проблема: углы изображения результата (после шага 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 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
Итак, как вы можете видеть, проблема возникает, когда увеличенное изображение imagecopyresampled к нему оригинального размера. Прозрачные углы заполняются цветом $colorcode. Я играл с imagesavealpha() и imagealphablending() как , но результата нет.
Пожалуйста, помогите мне сделать эту работу.
P.S. Это может быть полезно: при загрузке большого PNG на imgur.com он имел преобразованный в JPG, и, как вы видите, все углы заполнены очень восстановленным цветовым кодом $.
P.S. Надеюсь, мне не будет запрещено использовать слово "расширение":)

