Felipe Oliveira da Silva
Dicas de programação e portfólio
  • Javascript
  • MySQL
  • Outros
  • PHP
  • Trabalhos
    • Estrutura (CSS)
    • Hotsites
    • Sistemas
    • Websites
  • Web
PHP

Redimensionando imagens em PHP

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.

function redimensiona($origem,$destino,$maxlargura=100,$maxaltura=100,$qualidade=80){
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.

function redimensiona_fixo($origem,$destino,$maxlargura,$maxaltura,$qualidade=80)
{
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

Postado em 09 de fevereiro de 2009 às 13:53

19 Comentários »

19 Comentários em “Redimensionando imagens em PHP”

  1. Leonardo diz:
    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?

  2. Hugo diz:
    08 de novembro de 2009 às 00:45

    Estou com o mesmo problema, mas o script é muito bom!

  3. Felipe diz:
    10 de novembro de 2009 às 09:06

    Hugo,
    Qual o problema?
    Abs,
    felipe

  4. Mi diz:
    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 =)

  5. Felipe diz:
    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

  6. Mi diz:
    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.
    =)

  7. Felipe diz:
    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

  8. Mi diz:
    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.

  9. Felipe diz:
    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

  10. Mi diz:
    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.

  11. Lucas diz:
    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));

  12. Felipe diz:
    19 de junho de 2010 às 22:37

    Sim Lucas, é uma boa dica!
    Sugestões são sempre bem vindas.

  13. Wallace diz:
    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

  14. sanoj diz:
    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!

  15. Danilo Reis diz:
    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?

  16. Felipe diz:
    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,

  17. Danilo Reis diz:
    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!

  18. Rafael diz:
    02 de julho de 2011 às 03:35

    Felipe, este teu código me salvou, parabéns e obrigado! Grande abraço!

  19. Bruno diz:
    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

Comentar

Busca

  • Popular
  • Comentados
  • Últimos

  • Galeria de fotos com jquery - Demo 1
  • Criando tabelas no MySQL
  • Envio de e-mail com PHPMailer
  • Recebendo dados de formulário
  • Conectando ao Banco de Dados MySQL com PHP
  • Operadores (aritmético, comparação, lógico, atribuição)
  • Lightbox 2
  • Trabalhando com data no PHP
  • Redimensionando imagens em PHP
  • Programação Orientada a Objetos em PHP
  • Galeria de fotos com jquery – Demo 1 (84)
  • Envio de e-mail com PHPMailer (32)
  • Lightbox 2 (30)
  • Redimensionando imagens em PHP (19)
  • Criando abas com Javascript (16)
  • Conectando ao Banco de Dados MySQL com PHP (16)
  • Estruturas de repetição em PHP (while, do while, for e foreach) (9)
  • Criando tabelas no MySQL (9)
  • Até o "concorrente" usa GMAIL (9)
  • Recebendo dados de formulário (6)
  • Conectando ao Banco de Dados MySQL com PHP
  • Programação Orientada a Objetos em PHP
  • GOL Indica
  • Manga comunicação e marketing
  • Firefox 4.0 deve ser lançado em 2010
  • Google Street View se preocupa com a privacidade das pessoas
  • Atrações Educativas – Educar para crescer
  • Realidade aumentada
  • Projetos Residentes Roc
  • Office 2010 com nova proteção antipirataria

Categorias

  • Estrutura (CSS)
  • Hotsites
  • Javascript
  • MySQL
  • Outros
  • PHP
  • Sistemas
  • Web
  • Websites

Arquivos

  • dezembro 2009
  • outubro 2009
  • setembro 2009
  • agosto 2009
  • julho 2009
  • junho 2009
  • maio 2009
  • abril 2009
  • março 2009
  • fevereiro 2009
  • janeiro 2009
  • dezembro 2008
  • novembro 2008

Tags

abas array banco de dados Bing.com chrome classes Condicionais conexão construtor Cookie CSS domínio expressão FAQ firefox formulário função Funções Galeria de fotos gmail google google chrome google maps Hotmail IE IE7 IE8 IE9 Internet internet explorer Javascript jquery kingston Layout Microsoft MySQL métodos objetos PHP Portfólio SEO sistema tecnologia twitter Web

Lista de links

  • Eduardo Willian
  • Fred Carbonare
  • Jhonatan
  • Rafael Jaques

© Felipe Oliveira da Silva
Wordpress Theme designed by DT Website Templates