Script para criar cantos arredondados em imagens.
Linguagem: PHP
Copyright 2010 Rubens Takiguti Ribeiro
Licença: LGPL 3 ou superior
/**
* 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 Cor em notacao hexadecimal #HHHHHH ou "transparente"
* @return void
*/
function criar_cantos_arredondados($img, $raio = 10, $cor = 'transparente') {
// 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, $matches) && $cor != 'transparente') {
throw new InvalidArgumentException('Cor precisa estar no formato #HHHHHH (H indica hexadecimal) ou valer "transparente"', 3);
}
// Reservar cor
if ($matches) {
$cor = array(
'r' => hexdec($matches[1]),
'g' => hexdec($matches[2]),
'b' => hexdec($matches[3])
);
$index_cor = imagecolorallocate($img, $cor['r'], $cor['g'], $cor['b']);
} else {
imagealphablending($img, false);
imagesavealpha($img, true);
$index_cor = imagecolorallocatealpha($img, 0xFF, 0xFF, 0xFF, 127);
}
// 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);
}
}
Para usar, é preciso passar um resource de imagem gerado pela extensão GD. Existem várias funções que criam um resource de imagem, veja um exemplo:
// Criando a imagem a partir de um arquivo
$img = imagecreatefromjpeg('/caminho/ate/a/imagem.jpg');
// Criando cantos arredondados
criar_cantos_arredondados($img);
Depois disso, você pode salvar o conteúdo sobrescrevendo o arquivo original, ou salvá-lo com novo nome, conforme exemplo:
imagejpeg($img, '/caminho/ate/a/imagem.jpg', 100);
Ou pode gerar um arquivo PHP que exibe uma imagem dinamicamente, sem salvá-la com os cantos arredondados:
header('Content-type: image/jpeg');
imagejpeg($img, '', 100);
exit(0);
Cor transparente
Existem duas formas de se deixar o fundo do canto arredondado com transparência. Se o formato utilizado aceita nível de transparência, como PNG, você pode passar a string 'transparente' no lugar da cor desejada, conforme exemplo:
$img = imagecreatefrompng('teste.png');
criar_cantos_arredondados($img, 50, 'transparente');
header('Content-Type: image/png');
imagepng($img);
exit(0);
Mas se você está trabalhando com um formato que utiliza cores indexadas, como o GIF, então precisa usar uma cor de fundo e, depois, falar que aquela cor deverá ser interpretada como transparente, conforme exemplo:
$img = imagecreatefrompng('teste.gif');
criar_cantos_arredondados($img, 50, '#FF00FF');
// Registrar a cor #FF00FF como sendo transparente
imagecolortransparent($img, imagecolorexact($img, 0xFF, 0x00, 0xFF));
header('Content-Type: image/gif');
imagegif($img);
exit(0);
2 comentários
Como utilizo esse script
Olá, visitante,
Agora incluí as instruções de uso da função e um exemplo. Espero que isso ajude. Qualquer dúvida é só perguntar.
Postar um comentário
Nota: fique a vontade para expressar o que achou deste artigo ou do blog.
Dica: para acompanhar as respostas, acesse com uma conta do Google e marque a opção "Notifique-me".
Atenção: o blogger não permite inclusão de tags nos comentários, por isso, use algum site externo para postar seu código com dúvidas e deixe o link aqui. Exemplo: pastebin.com