Hoje vou mostrar uma função para redimensionar imagens, seja ela para um sistema gerenciador de conteúdo ou uma simples galeria. Quem trabalha com programação web sabe que precisamos estar sempre aptos a lidar com imagens já que elas são itens fundamentais dentro dos websites.
Certo, mas por que ter um trabalho para fazer uma função dessa e não apenas pedir para o usuário administrador enviar as imagens no formato correto?
Isso seria uma das maiores burrices, Um porque daria muito trabalho para ficar redimensionando uma por uma e outra que se o cara não entender muito bem de Internet vai acabar fazendo besteira.
Lembra daquela velha frase “Nunca confie no usuário”.
Essa função suporta os tipos de imagens mais comuns, são elas:
PNG, JPG e GIF
Exemplo 1:
Redimensiona imagens de acordo com uma largura ou altura máxima, o que chegar primeiro.
if(!strstr($origem,”http”) && !file_exists($origem)){
echo(“Arquivo de origem da imagem inexistente”);
return false;
}
$ext = strtolower(end(explode(‘.’, $origem)));if($ext == “jpg” || $ext == “jpeg”){
$img_origem = @imagecreatefromjpeg($origem);
}
elseif ($ext == “gif”){
$img_origem = @imagecreatefromgif($origem);
}
elseif ($ext == “png”){
$img_origem = @imagecreatefrompng($origem);
}
if(!$img_origem){
echo(“Erro ao carregar a imagem, talvez formato nao suportado”);
return false;
}
$alt_origem = imagesy($img_origem);
$lar_origem = imagesx($img_origem);
$escala = min($maxaltura/$alt_origem, $maxlargura/$lar_origem);
if($escala < 1){
$alt_destino = floor($escala*$alt_origem);
$lar_destino = floor($escala*$lar_origem);
// Cria imagem de destino
$img_destino = imagecreatetruecolor($lar_destino,$alt_destino);
// Redimensiona
imagecopyresampled($img_destino, $img_origem, 0, 0, 0, 0, $lar_destino, $alt_destino, $lar_origem, $alt_origem);
imagedestroy($img_origem);
}
else {
$img_destino = $img_origem;
}
$ext = strtolower(end(explode(‘.’, $destino)));
if($ext == “jpg” || $ext == “jpeg”){
imagejpeg($img_destino,$destino,$qualidade);
return true;
}
elseif ($ext == “gif”){
imagepng($img_destino,$destino);
return true;
}
elseif ($ext == “png”){
imagepng($img_destino,$destino);
return true;
}
else {
echo(“Formato de destino nao suportado”);
return false;
}
}
Exemplo 2:
Redimensiona imagens para o tamanho especificado, corta caso necessário.
{
if(!strstr($origem,”http”) && !file_exists($origem)) {
echo(“Arquivo de origem da imagem inexistente”);
return false;
}
$ext = strtolower(end(explode(‘.’, $origem)));
if($ext == “jpg” || $ext == “jpeg”) {
$img_origem = @imagecreatefromjpeg($origem);
}
elseif ($ext == “gif”) {
$img_origem = @imagecreatefromgif($origem);
}
elseif ($ext == “png”) {
$img_origem = @imagecreatefrompng($origem);
}
if(!$img_origem) {
echo(“Erro ao carregar a imagem, talvez formato nao suportado”);
return false;
}$maxAltura = 20;
do {
$alt_origem = imagesy($img_origem);
$lar_origem = imagesx($img_origem);
$escala = min($maxAltura/$alt_origem, $maxAltura/$lar_origem);
$alt_destino = floor($escala*$alt_origem);
$lar_destino = floor($escala*$lar_origem);
$maxAltura = $maxAltura+2;
}while($alt_destino<=$maxaltura or $lar_destino<=$maxlargura);
$alt = ceil((((50*$alt_destino)/100))-ceil($maxaltura/2));
$lar = ceil((((50*$lar_destino)/100))-ceil($maxlargura/2));
// Cria imagem de destino
$img_destino = imagecreatetruecolor($maxlargura,$maxaltura);
// Redimensiona
imagecopyresampled($img_destino, $img_origem, -$lar, -$alt, 0, 0, $lar_destino, $alt_destino, $lar_origem,
$alt_origem);
imagedestroy($img_origem);
$ext = strtolower(end(explode(‘.’, $destino)));
if($ext == “jpg” || $ext == “jpeg”) {
imagejpeg($img_destino,$destino,$qualidade);
return true;
}
elseif ($ext == “gif”) {
imagepng($img_destino,$destino);
return true;
}
elseif ($ext == “png”) {
imagepng($img_destino,$destino);
return true;
}
else {
echo(“Formato de destino nao suportado”);
return false;
}
}
Agora vou mostrar como você chama a função:
$OBImagem = new OBImagem(); //Instância a classe
$OBImagem->redimensiona(“./img_real.jpg”,”./img.jpg”,90,90,75); //executa função redimensiona
$OBImagem->redimensiona_fixo(“./img_real.jpg”,”./img_peq.jpg”,107,80,60); //executa função redimensiona_fixo
Os parâmetros passados na função são respectivamente:
- Caminho da imagem real incluindo o nome da imagem e sua extensão
- Caminho onde irá gerar a nova imagem incluindo o nome da imagem e sua extensão
- Largura
- Altura
- Qualidade (Usado para imagens JPG)
Clique aqui para fazer o download do exemplo completo

10 de agosto de 2009 às 12:44
Eu subi uma imagem em png com o fundo transparente, e quando a classe redimensionou ela, ficou preto onde era transparente.
Alguem sabe como corrigir isso e manter o fundo transparente?
08 de novembro de 2009 às 00:45
Estou com o mesmo problema, mas o script é muito bom!
10 de novembro de 2009 às 09:06
Hugo,
Qual o problema?
Abs,
felipe
24 de novembro de 2009 às 15:05
Olá. Parabéns pelo script, ele é simple e objetivo.
Porém, localmente ele funciona normalmente e quando eu coloco no servidor dá um erro dizendo que a imagem está em um formato não suportado. Não sei porque está acontecendo isso. A imagem que eu coloquei é .jpg e mesmo assim continua com o erro. Você poderia me ajudar com esse problema?
Obrigada.
Valeu =)
24 de novembro de 2009 às 15:48
Mi,
Você testou se realmente esta pegando a imagem no caminho correto?
Tenta dar permissão 777 na imagem e no diretório de
origem e no diretório de destino.
Qualquer dúvida estou a disposição.
abs,
Felipe
25 de novembro de 2009 às 15:28
Olá Felipe.
Entao, a imagem de origem poder ser um link para uma imagem na internet. Você sabe se para essa utilização é necessário colocar permissao 777 sendo que a imagem pode ser uma url fora do meu servidor.
=)
25 de novembro de 2009 às 15:43
Mi,
Não pode ser uma URL, tem que ser o caminho de uma URL que esteja no servidor, exemplo:
“../imagem/imagem.jpg”
Abs,
Felipe
26 de novembro de 2009 às 10:58
Felipe,
Estou criando um blog onde o usuario pode colocar uma imagem no servidor ou colocar a url de uma imagem. Entendeu? Estou trabalhando com Wordpress.
26 de novembro de 2009 às 15:48
Para colocar a URL da imagem não da. Pq para redimensionar precisa estar no mesmo servidor entendeu?
Abs,
Felipe
30 de novembro de 2009 às 10:35
Hum, agora eu entendi. =D
Terei que pesquisar uma outra solução para o meu problema, mas mesmo assim muito obrigada pela ajuda Felipe.
19 de junho de 2010 às 18:40
Muito bom o script…
uma dica:
em fez de colocar varios ifs não era melhor usar:
if($ext==”jpg”||$ext==”jpeg”||$ext==”gif”||$ext==”png”)$img_origem = imagecreatefromstring(file_get_contents($origem));
19 de junho de 2010 às 22:37
Sim Lucas, é uma boa dica!
Sugestões são sempre bem vindas.
11 de agosto de 2010 às 20:46
Felipe, seu script tem sido muito útil para mim,
porem senti necessidade de adicionar um tratamento para os diferentes tipos de imagens, e quando não estiver dentro dos tipos, ou ocorrer algum erro no upload ele retorne false. Porem a sua classe não retorna nada, e nao sei utilizar as funções dela para me retornar esses valores, já elas trabalham retornando true e false.
Att,
Wallace Barboza
11 de janeiro de 2011 às 16:00
Mando bem de mais!
vou colocar esta função no meu blog, divulgando lógico que você é o criador da função!
23 de março de 2011 às 10:20
Felipe..
É possível o seguinte caso?
O redimensiona_fixo se vc tem uma imagem ele redimensiona cortanto a imagem um valor x da parte superior e um valor x da parte inferior.
Eu queria q qdo eu envio uma imagem e esse corte é necessário ele cortar somente da parte inferior da imagem, como trabalho com flyers, a maioria dos textos estão na parte superior da imagem, e qdo redimensiona acaba cortando a imagem em partes importantes.
É possível redimensionar mas deixando o topo da imagem intacto, cortando apenas a parte de baixo para poder redimensionar no tamanho desejado?
23 de março de 2011 às 16:34
Olá,
Mude a linha
$alt = ceil((((50*$alt_destino)/100))-ceil($maxaltura/2));
para $alt = 0;
Abraços,
23 de março de 2011 às 17:00
Isso mesmo que eu queria..
Muito obrigado.. Agradeço a ajuda..
Seu código me quebrou um galho e tanto.
Vlw!
02 de julho de 2011 às 03:35
Felipe, este teu código me salvou, parabéns e obrigado! Grande abraço!
27 de outubro de 2011 às 13:50
Olá gostaria de evitar o corte na imagem, quero que a imagem somente seja redimensionada, desde já obrigado