Colocando marca d água em imagens zipadas
Friday, November 21, 2008 4:19:12 PM
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!











Unregistered user # Friday, November 21, 2008 5:10:15 PM
Unregistered user # Friday, November 21, 2008 5:38:49 PM
Unregistered user # Friday, March 6, 2009 2:29:49 AM
Unregistered user # Friday, May 15, 2009 11:54:32 AM
Unregistered user # Saturday, September 19, 2009 1:44:45 AM
Unregistered user # Tuesday, March 22, 2011 4:17:56 PM