Jump to content
kutmania

Redimensionamento de imagem dinamicamente

Recommended Posts

Olá, amigos! Estou desenvolvendo uma plataforma de loja virtual onde cada cliente poderá escolher um template diferente para a sua loja. Cada template terá imagens com tamanhos diferentes e o cliente poderá mudar o template quando bem quiser.

 

Daí preciso de uma solução para as imagens dos produtos, banners etc. Ou seja, não acho viável gerar miniaturas para todos os templates possíveis. Uma solução que pensei foi usar a biblioteca PHP para redimensionar a imagem. Estilo o que este link faz:

 

https://cdn.awsli.com.br/380x380/230/230436/produto/16603367/5f23799375.jpg

 

percebam que se eu alterar os parâmetros de 380x380 para 370x370 o tamanho da imagem muda. Isso resolveria o meu problema. Mas estou preocupado com o processamento que isso vai ter do lado do servidor. Pensei na possibilidade de usar algum sistema de caching para fazer esse redimensionamento apenas uma vez. Enfim.. estou sem saber qual a melhor solução para o meu problema e se realmente essa seria uma solução.

 

alguém teria alguma luz nesse sentido?

 

 

Share this post


Link to post
Share on other sites

Eu guardo a imagem original em uma pasta, e toda vez que preciso dela redimensionada, executo um script.

Esse script verifica se o arquivo com a imagem já dimensionada existe. Caso não existe, cria uma cópia redimensionada e a exibe.

 

Exemplo:

  1. Imagem original tem 1200x900
  2. Preciso dela em 3 medidas: 400x350 na home, 150x150 nos thumbnails dos detalhes de produtos e em 800x500 (que seria o zoom deste thumbnail)
  3. Caso seja a primeira vez que tal script seja executado, ele grava uma cópia já cropada e dimensionada no servidor, e a executa no navegador, para exibí-la. Caso seja a segunda vez pra frente, usa a imagem já cortada. Isso diminui muito o uso da performance do servidor.

Utilizo a biblioteca Intervention Image que faz todo o trâmite de redimensionar, cropar e salvar.

Share this post


Link to post
Share on other sites

Caso queira o funcionamento, baixe a biblioteca, e segue exemplo de como eu faço:

 

index.php

$resultadoImagem = "20171550.jpg"; // * Pode vir do banco

// * Traz a imagem
if(!empty($resultadoImagem)){
    $arquivo = pathinfo($_SERVER['DOCUMENT_ROOT']."/upload/imagem/".$resultadoImagem); // * Verifica se a imagem existe no banco
    $arquivoNomeThumb01 = $arquivo['filename']."_l-740"."_a-885"."_c-true_cd-center_e.".$arquivo['extension']; // Cria o nome para gravar na pasta /upload/imagem/
    $imagemThumb = (file_exists($_SERVER['DOCUMENT_ROOT']."/upload/imagem/".$arquivoNomeThumb01)) ? "/upload/imagem/".$arquivoNomeThumb01 : "/common/function/thumb.php?largura=740&altura=885&crop=true&cropDir=center&url=../../upload/imagem/".$resultadoImagem; // * Se existir a imagem gerada, utiliza ela. Caso não, exibe o thumb via server e gera uma cópia nova
}

// * Não traz imagem
else{
    $imagemThumb = "/site/img/layout/sem-imagem.jpg";
}

 

thumb.php

<?php
	
	/**
	* @author Maykel Esser
	* @copyright (C)2016, Maykel Esser.
	* @version 2.0.0
	* @since 1.0.0
	* @package Continuum Framework 2 Beta
	*/

	require('../lib/autoload.php');

	use Intervention\Image\ImageManagerStatic as Image;

	// * Especificações
	$arquivo = pathinfo($_GET['url']);
	$infoLargura = $_GET['largura'];
	$infoAltura = $_GET['altura'];
	$infoCrop = $_GET['crop'];
	$infoCropDir = $_GET['cropDir'];
	$infoCaminho = $_GET['url'];
	$infoNome = $arquivo['filename'];
	$infoExtensao = $arquivo['extension'];
	$infoQualidade = 80;

	// * Formato de leitura da imagem
	$arquivoNomeThumb = $infoNome;
	$arquivoNomeThumb .= (!empty($infoLargura)) ? "_l-".$infoLargura : "";
	$arquivoNomeThumb .= (!empty($infoAltura)) ? "_a-".$infoAltura : "";
	$arquivoNomeThumb .= (!empty($infoCrop)) ? "_c-".$infoCrop : "";
	$arquivoNomeThumb .= (!empty($infoCropDir)) ? "_cd-".$infoCropDir : "";
	$arquivoNomeThumb .= (!empty($infoExtensao)) ? "_e.".$infoExtensao : "";

	$img = Image::make($infoCaminho);
	
	if(isset($infoCrop) && $infoCrop == true){
		if(isset($infoCropDir)){
			$img->fit($infoLargura,$infoAltura,null,$infoCropDir);
		}
		else{
			$img->fit($infoLargura,$infoAltura);
		}
	}
	else{
		$img->resize($infoLargura, $infoAltura, function ($constraint){
			$constraint->aspectRatio();
		});
	}
	
	$img->save($_SERVER['DOCUMENT_ROOT'].'/upload/imagem/'.$arquivoNomeThumb); // * salva uma cópia
	echo $img->response($infoExtensao, $infoQualidade); // * Exibe a primeira vez
	
?>

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By kukamax
      Bom dia, alguém me indicaria alguma biblioteca para imprimir do laravel direto para uma impressora terrmica Bermatech MP-2800 TH.
    • By Danado_
      Galera estou com uma dúvida!
      como eu posso pular linha dentro de um while da seguinte forma:
      $contato = '5';
       
      id: 1
      id: 2
      id: 3
      <br>
      id: 4
      id: 5
      <br>
       
      como eu monto essa logica?
       
      while(){ if(){} }  
    • By KABEst
      boa noite, é meu primeiro post aqui, eu preciso de ajuda pra colocar um "churrascômetro" no meu site do wordpress, nao tenho noçao nenhuma de como fazer isso, alguem pode me dar um norte? é pra um trabalho da faculdade. obrigado

      exemplo de como eu quero fazer:
      http://www.epa.com.br/churrascometro/
    • By tiagosp
      Em uma classe, tenho um método que realiza o select no sql, até o momento funciona com requisições que solicitam uma única linha, porém quando é solicitado todas as linhas, ele retorna apenas o primeiro registro contido no MySQL.
      <?php class SQL { private $SQLUsuario = "root"; private $SQLSenha = ""; private $SQLHost = "127.0.0.1"; private $SQLBD = "database1"; public function SQLSelecionar($Comando){ #Executa o comando Select no SQL $Conn2 = mysqli_connect($this->SQLHost, $this->SQLUsuario, $this->SQLSenha, $this->SQLBD); $resultado = mysqli_query($Conn2, $Comando); if (mysqli_num_rows($resultado) > 0){ return mysqli_fetch_assoc($resultado); } else{ #Select retornou sem resultado(s) return null; } mysqli_close($Conn2); } }  
    • By Lisraf68
      Olá Pessoal!
       
      Estou tendo um problema com um link no site do meu cliente...esse link envia o usuário para pagina de acesso a um ambiente online do aluno... entretanto, o endereço para essa pagina só pode ser acessado quando os estudante estão fora do wifi da escola, do contrario eles não conseguem acessar pelo link que eu implementei na imagem que esta no site. Existe outro endereço para quem está conectado no wifi da escola, como sou iniciante, só sei que tenho que ter um código que quando o usuário clicar no link vai verificar se está conectado no servidor interno, se não, ele joga para o servidor externo, porem... Não faço a minima ideia de como estruturar esse código e linkar ele junto a imagem do site... se alguém puder me ajudar please!!! já pesquisei tudo e não consigo sozinha!
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.