Programação Especialista

Artigos de Programação em Geral

Colocando marca d água em imagens zipadas

, , , , ,

Muitas pessoas sentem dificuldade em tratamento de imagens com PHP. Muitas destas dificuldades se da ao fato que quase ninguém utiliza os recursos que a biblioteca GD oferece.
Irei mostrar um script extremamente simples.

Pega um arquivo zipado (pré-supondo que você ja fez o upload dele em uma pasta temporária);
Extrai os arquivos para uma pasta temporária ( a mesma ou outra que o desenvolvedor definir);
Exclui o arquivo ZIP;
Para cada imagem coloca a marca definida e move para uma outra pasta que o desenvolvedor definir;
Exclui as imagens temporárias.


Requisitos Para a execução deste script é necessário que o seu PHP seja superior ou igual a versão 5.0.x, pois utilizaremos a classe Ziparchive que só existe no PHP5. Classe em questão
<?
/** @todo Esta classe trata o upload de um arquivo 
 * zip de imagens, evitando que
 * seja feito o upload de arquivos maliciosos,
 * terá a opção de escolher quais tipos de imagens
 *  seu sistema ira receber, 
 * porem arquivos BMP nao sao muito bem aceitos. porem GIF,JPEG e PNG
 *  são suportados por padrão no GD
 */
 class marcaDagua{

	protected $logotipo;
	protected $_tmpExtraido;
	protected $_imagens;
	protected $_invalidos;
	protected $tempDir;
	protected $destDir;
	protected $pathZip;
	/** @todo Deve colocar como parametro somente o logotipo */
	function __construct($logotipo){
		$this->logotipo($logotipo);
	}
	/** @todo encapsuladores */

		function logotipo(){
			$params = (func_get_args());
			if(count($params)>0){
				$this->logotipo = $params[0];
			}else{
				return $this->logotipo;
			}
		}

		function _imagens(){
			$params = (func_get_args());
			if(count($params)>0){
				$this->_imagens = $params[0];
			}else{
				return $this->_imagens;
			}
		}

		function _invalidos(){
			$params = (func_get_args());
			if(count($params)>0){
				$this->_invalidos = $params[0];
			}else{
				return $this->_invalidos;
			}
		}

		function tempDir(){
			$params = (func_get_args());
			if(count($params)>0){
				$this->tempDir = $params[0];
			}else{
				return $this->tempDir;
			}
		}

		function destDir(){
			$params = (func_get_args());
			if(count($params)>0){
				$this->destDir = $params[0];
			}else{
				return $this->destDir;
			}
		}

		function pathZip(){
			$params = (func_get_args());
			if(count($params)>0){
				$this->pathZip = $params[0];
			}else{
				return $this->pathZip;
			}
		}

		function unZip(){
				$zip = new Ziparchive();
				if(!file_exists($this->pathZip())){
					exit('O arquivo zip não foi encontrado');

				}else{
					$zip->open($this->pathZip());
					$zip->ExtractTo($this->tempDir());
					for($i=0;$i!= $zip->numFiles;$i++){
						$imgs = $zip->statIndex($i);
						$this->_tmpExtraido[] = $imgs['name'];
					}
					$zip->close();
					unlink($this->pathZip());
					return true;
				}
			}

			function inserirMarca(){

			$l = explode('.',$this->logotipo());
			$ex = $l[count($l)-1];
			switch($ex){
				case 'gif':
				$watermark = imagecreatefromgif($this->logotipo());
				break;
				case 'png':
				$watermark = imagecreatefrompng($this->logotipo());
				break;

				default:
				$watermark = imagecreatefromjpeg($this->logotipo());
				break;

			}
			$watermark_width = imagesx($watermark);
			$watermark_height = imagesy($watermark);
			$image = imagecreatetruecolor($watermark_width, $watermark_height);
			for($i=0;$i!=count($this->_tmpExtraido);$i++){
				$l = explode('.',$this->_tmpExtraido[$i]);
				$ex = $l[count($l)-1];
				switch($ex){
					case 'gif':
					$image = imagecreatefromgif($this->tempDir().'/'.$this->_tmpExtraido[$i]);
					if(!$image){
						$this->_invalidos[] = $this->_tmpExtraido[$i];
					}else{
						$size = getimagesize($this->tempDir().'/'.$this->_tmpExtraido[$i]);
						$dest_x = $size[0] - $watermark_width - 5;
						$dest_y = $size[1] - $watermark_height - 5;
						imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0,
 $watermark_width, $watermark_height, 100);
						imagejpeg($image,$this->destDir().'/'.$this->_tmpExtraido[$i]);
						imagedestroy($image);
						$this->_imagens[] = $this->destDir().'/'.$this->_tmpExtraido[$i];
					}
					@unlink($this->tempDir().'/'.$this->_tmpExtraido[$i]);
					break;
					case 'png':
					$image = imagecreatefrompng($this->tempDir().'/'.$this->_tmpExtraido[$i]);
					if(!$image){
							$this->_invalidos[] = $this->_tmpExtraido[$i];
					}else{
						$size = getimagesize($this->tempDir().'/'.$this->_tmpExtraido[$i]);
						$dest_x = $size[0] - $watermark_width - 5;
						$dest_y = $size[1] - $watermark_height - 5;
						imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, 
$watermark_width, $watermark_height, 100);
						imagejpeg($image,$this->destDir().'/'.$this->_tmpExtraido[$i]);
						imagedestroy($image);
						$this->_imagens[] = $this->destDir().'/'.$this->_tmpExtraido[$i];
					}
					@unlink($this->tempDir().'/'.$this->_tmpExtraido[$i]);
					break;
					default:
					$image = @imagecreatefromjpeg($this->tempDir().'/'.$this->_tmpExtraido[$i]);
					if(!$image){
						$this->_invalidos[] = $this->_tmpExtraido[$i];
					}else{
						$size = getimagesize($this->tempDir().'/'.$this->_tmpExtraido[$i]);
						$dest_x = $size[0] - $watermark_width - 5;
						$dest_y = $size[1] - $watermark_height - 5;
						imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, 
$watermark_width, $watermark_height, 100);
						imagejpeg($image,$this->destDir().'/'.$this->_tmpExtraido[$i],100);
						imagedestroy($image);
						$this->_imagens[] = $this->destDir().'/'.$this->_tmpExtraido[$i];
					}
					@unlink($this->tempDir().'/'.$this->_tmpExtraido[$i]);
					break;
				}
			}

			return $this->_imagens;
		}

		function log(){
			echo "Imagens convertidas com sucesso:<br>";
			if(count($this->_imagens) > 0 ){
				for($i=0;$i!=count($this->_imagens);$i++){
					echo $this->_imagens[$i].'<br>';
				}
			}
			echo "<br>Erro na conversão:<br>";
			if(count($this->_invalidos) > 0 ){
				for($i=0;$i!=count($this->_invalidos);$i++){
					echo $this->_invalidos[$i].'<br>';
				}
			}
		}
 }
?>
Como utilizar: Instanciaremos nossa classe com a imagem que servirá de marca d'água. Feito isso iremos setar todos os caminhos que o sistema irá utilizar, como onde esta o arquivo ZIP, a pasta onde irão ficar as imagens que foram extraidas do zip e a pasta onde ficarão os arquivos modificados com a marca escolhida. Feito isso utilizaremos o método unZip que irá extrair os arquivos e se executar com sucesso irá transformar as imagens com a marca d'agua. Note que o método inserirMarca() esta sendo atribuída à uma variável, ou seja o caminho das imagens alteradas estarão em forma de array na variavel $imagens. Existe também um método chamado log() ele mostrará todo o processo de conversão, se por algum motivo o usuário submeter arquivos que não correspondem à imagens, como arquivos executáveis ou PHP, na tentativa de hackear seu sistema, ficará neste LOG e você poderá tratar como desejar.
<?
$agua = new marcaDagua('banner.png');
$agua->pathZip('tmpzip/imagens.zip');
$agua->tempDir('tmpimgs');
$agua->destDir('dstimgs');
if($agua->unZip()){
	$imagens = $agua->inserirMarca();
	$agua->log();
}
?>
Fazendo isso a imagem ficará assim: NOTA: É recomendavel que a imagem que será a marca d'água, seja PNG, pois a transparência do PNG é melhor explorada no GD, o GIF pode ficar pixelado o fundo. Se por algum acaso o usuário subir uma imagem que seja muito maior, você pode utilizar a classe de redimensionamento de imagens que existe aqui mesmo no blog. Até o próximo post!

Design Pattern - FACTORYCriando um webservice para outras pessoas acessarem via programação

Comments

Unregistered user Friday, November 21, 2008 5:10:15 PM

helder writes: A cara num tem nem oq falar! simplesmente foda !!! meu presente de aniversário rsrsrrsrsrrs Vlw ^^

Unregistered user Friday, November 21, 2008 5:38:49 PM

Rafa writes: AÊÊÊ PHP.... arregaçou... show de bollaaaaaaa manooooo You Win Perfect rssss abs Truta

Unregistered user Friday, March 6, 2009 2:29:49 AM

MarcelloMtv writes: Showwwwwwwwwwwwwwwwww!!!!

Unregistered user Friday, May 15, 2009 11:54:32 AM

Rafa writes: Hou hou meu MLk... show de Bola PHP... esta é mais uma que utilizarei em meus scripts.... Parabénsss truta.

Unregistered user Saturday, September 19, 2009 1:44:45 AM

Anonymicus writes: Da para postar ai ele para download

Unregistered user Tuesday, March 22, 2011 4:17:56 PM

Jorge Vieira writes: Muito boa a sua aplicação. Vlw.

Write a comment

New comments have been disabled for this post.