/** * Cria cantos arredondados em uma foto * @param resource $img Resource de imagem criada pela biblioteca GD * @param int $raio Tamanho do raio da circunferencia * @param string $cor_hexa Cor em notacao hexadecimal #HHHHHH * @return void */ function criar_cantos_arredondados($img, $raio = 10, $cor_hexa = '#FFFFFF') { // Checar parametros if (!extension_loaded('gd')) { throw new RuntimeException('Biblioteca GD precisa ser carregada', 1); } if (!is_resource($img)) { throw new InvalidArgumentException('Imagem precisa ser um resouce da GD', 1); } if (!is_numeric($raio)) { throw new InvalidArgumentException('Raio precisa ser numerico', 2); } if (!preg_match('/^#([A-F\d]{2})([A-F\d]{2})([A-F\d]{2})$/i', $cor_hexa, $matches)) { throw new InvalidArgumentException('Cor precisa estar no formato #HHHHHH (H indica hexadecimal)', 3); } // Reservar cor $cor = array( 'r' => hexdec($matches[1]), 'g' => hexdec($matches[2]), 'b' => hexdec($matches[3]) ); $index_cor = imagecolorallocate($img, $cor['r'], $cor['g'], $cor['b']); // Obter tamanho da imagem $w = imagesx($img); $h = imagesy($img); // Caminhar sobre o eixo Y nos diferentes cantos da imagem // e imprimir uma linha que vai da extremidade ate o cosseno do angulo percorrido $passo = 1 / $raio; for ($i = 0; $i <= $raio; $i++) { $seno = $passo * $i; $cosseno = sqrt(1 - pow($seno, 2)); // Canto superior esquerdo $x1 = 0; $y1 = $raio - $i; $x2 = $raio - ($cosseno * $raio); $y2 = $y1; imageline($img, $x1, $y1, $x2, $y2, $index_cor); // Canto superior direito $x1 = $w - $raio + ($cosseno * $raio); $y1 = $raio - $i; $x2 = $w; $y2 = $y1; imageline($img, $x1, $y1, $x2, $y2, $index_cor); // Canto inferior esquerdo $x1 = 0; $y1 = $h - $raio + $i; $x2 = $raio - ($cosseno * $raio); $y2 = $y1; imageline($img, $x1, $y1, $x2, $y2, $index_cor); // Canto inferior direito $x1 = $w - $raio + ($cosseno * $raio); $y1 = $h - $raio + $i; $x2 = $w; $y2 = $y1; imageline($img, $x1, $y1, $x2, $y2, $index_cor); } }