Скругленные прозрачные _smooth_ углы с использованием imagecopyresampled () PHP GD

Мне нужен сценарий, который делает закругленные прозрачные углы на предоставленном изображении. Я нашел один, и он работает хорошо, за исключением одного: нанесенные углы не выглядят гладкими. imageantialias () выдает фатальную ошибку, поскольку PHP работает на Debian , и его повторная компиляция невозможна.

Уловка, которую я нашел, чтобы заставить эти углы выглядеть гладкими изменяет размер изображения с помощью imagecopyresampled () следующим образом:

  1. подготавливает изображение;
  2. imagecopyпример до 10-кратного размера;
  3. рисование углов особым цветом;
  4. сделать этот цвет прозрачным;
  5. уменьшить изображение до его исходного размера

Но вот проблема: углы результирующего изображения (после шага 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 () и imagealphablending () , как посоветовал , но безрезультатно.

Пожалуйста, помогите мне выполнить эту работу.

PS Это может быть полезно: при загрузке большого PNG на imgur.com он конвертировал в JPG ] и, как вы можете видеть, все углы были заполнены этим восстановленным $ colorcode.

PS Надеюсь, меня не забанят за чрезмерное использование слова "увеличение" :)

11
задан Community 23 May 2017 в 10:29
поделиться