Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

BrunoVieira

crop imagem

Recommended Posts

queria fazer um script em que ao fazer o upload de uma imagem essa imagem vai ser cortada com um tamanho fixo. A ideia é criar um género de banner.

 

 

algum me sabe dar alguma dica, procurei nos script do forum e não encontrei..

 

desde já obrigado pela ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

queria fazer um script em que ao fazer o upload de uma imagem essa imagem vai ser cortada com um tamanho fixo. A ideia é criar um género de banner.

 

 

algum me sabe dar alguma dica, procurei nos script do forum e não encontrei..

 

desde já obrigado pela ajuda

 

Kara, fiz isso aqui faz muuuuuuito tempo para um projeto que precisava de exatamente isso, de uma olhada:

 

/**
 * Carregamento e redimensionamento de imagens
 */
class Image {
	/**
	 * Extensão padrão da imagem, caso nenhuma seja fornecida
	 */
	const DEFAULT_IMG_EXT			= "jpg";

	/**
	 * Qualidade padrão quando formos salvar um jpg
	 */
	const DEFAULT_IMG_QUALITY		= 75;

	/**
	 * Utilizado para redimensionar uma imagem mantendo o aspecto dela
	 */
	const RESIZE_MAINTAIN_ASPECT	= 0;

	/**
	 * Utilizado para redimensionar uma imagem diminuindo a caixa
	 */
	const RESIZE_BOX				= 1;

	/**
	 * A extensão da imagem
	 * @var string
	 */
	protected $ext					= self::DEFAULT_IMG_EXT;

	/**
	 * Recurso gerado pela GD
	 * @var resource
	 */
	protected $img;

	/**
	 * O nome do arquivo
	 * @var string
	 */
	public $file;

	/**
	 * Uma imagem que será utilizada como pano de fundo
	 * @var string
	 */
	public $background;

	/**
	 * Qualidade que será utilizado para salvar uma imagem
	 * @var integer
	 */
	public $quality				= self::DEFAULT_IMG_QUALITY;

	/**
	 * Largura da imagem
	 * @var integer
	 */
	public $width;

	/**
	 * Altura da imagem
	 * @var integer
	 */
	public $height;

	/**
	 * Cria um novo objeto que será utilizado para manipular a imagem
	 */
	public function __construct(){
		$this->img			= null;
		$this->file			= "";
		$this->background	= "";
		$this->width		= 0;
		$this->height		= 0;
	}

	/**
	 * Carrega a imagem
	 * @param $string $file O nome do arquivo que será carregado
	 * @return Image Instância do objeto criado
	 */
	public function load( $file ){
		$match = array();

		if ( file_exists( $file ) ){
			$this->file	= $file;

			if ( preg_match( "/[^\\.]*\\.(\\w*)/" , $file , $match ) )
				$this->ext = strtolower( $match[ 1 ] );

			switch ( $this->ext ){
				case "png" :
					$this->img = @imagecreatefrompng( $this->file );
					break;
				case "gif" :
					$this->img = @imagecreatefromgif( $this->file );
					break;
				case "jpg" :
				default:
					$this->img = @imagecreatefromjpeg( $this->file );
					break;
			}

			$this->width	= @imagesx( $this->img );
			$this->height	= @imagesy( $this->img );
		}

		return( $this );
	}

	/**
	 * Carrega uma imagem de uma string (normalmente utilizado com imagens salvas em banco de dados)
	 * @param string $str A string que contém a imagem
	 * @return Image Instância do objeto criado
	 */
	public function loadStr( $str ){
		$this->img = @imagecreatefromstring( $str );

		$this->width	= @imagesx( $this->img );
		$this->height	= @imagesy( $this->img );
		
		return( $this );
	}

	/**
	 * Destroi o recurso da imagem gerado pela GD
	 * @return Image Instância do objeto criado
	 */
	public function destroy(){
		if ( $this->img )
			@imagedestroy( $this->img );

		return( $this );
	}

	/**
	 * Redimensiona a imagem
	 * @param integer $width A nova largura da imagem
	 * @param integer $height A nova altura da imagem
	 * @param integer $type Define se vamos manter o aspecto ou se vamos redimensionar a caixa
	 * @return Image Instância do objeto criado
	 */
	public function resize( $width = null , $height = null , $type = self::RESIZE_MAINTAIN_ASPECT ){
		$oldWidth	= @imagesx( $this->img );
		$oldHeight	= @imagesy( $this->img );
		$oldRatio	= $oldWidth / $oldHeight;
		$newWidth	= $this->width;
		$newHeight	= $this->height;

		if ( $width		) $newWidth		= $width;
		if ( $height	) $newHeight	= $height;

		$tempimg = @imagecreatetruecolor( $newWidth , $newHeight );
		@imagecolorallocate( $tempimg ,255 , 255 , 255 );

		switch ( $type ){
			case self::RESIZE_MAINTAIN_ASPECT:
				if ( ( $newWidth / $newHeight ) > $oldRatio ){
   					$newWidth = $newHeight * $oldRatio;
				} else {
   					$newHeight = $newWidth / $oldRatio;
				}

				if ( file_exists( $this->background ) ){
					$background = imagecreatefromjpeg( $this->background );
					imagecopy( $tempimg , $background , 0 , 0 , 0 , 0 , imagesx( $background ) , imagesy( $background ) );
					imagedestroy( $background );
				}

				if ( imagecopyresampled( $tempimg , $this->img , 0 , 0 , 0 , 0 , $newWidth , $newHeight , $oldWidth, $oldHeight ) )
					$this->img = $tempimg;

				break;
			case self::RESIZE_BOX:
			default:
				if ( imagecopyresized( $tempimg , $this->img , 0 , 0 , 0 , 0 , $newWidth , $newHeight , $oldWidth , $oldHeight ) )
					$this->img = $tempimg;
				break;
		}

		$this->width	= imagesx( $this->img );
		$this->height	= imagesy( $this->img );

		return( $this );
	}

	/**
	 * Salvamos a imagem para um arquivo
	 * @param string $file O nome do arquivo que iremos salvar a imagem
	 * @return Image Instância do objeto criado
	 */
	public function save( $file = null ){
		if ( $this->img ){
			if ( !$file ) $file = $this->file;

			switch ( $this->ext ){
				case "png" :
					@imagepng( $this->img , $file , $this->quality );
					break;
				case "gif" :
					@imagegif( $this->img , $file , $this->quality );
					break;
				case "jpg" :
				default:
					@imagejpeg( $this->img , $file , $this->quality );
					break;
			}
		}

		return( $this );
	}

	/**
	 * Enviamos a imagem para a saída padrão
	 * @return Image Instância do objeto criado
	 */
	public function flush(){
		switch ( $this->ext ){
			case "png" :
				@imagepng( $this->img );
				break;
			case "gif" :
				@imagegif( $this->img );
				break;
			case "jpg" :
			default:
				@imagejpeg( $this->img , null , $this->quality );
				break;
		}

		return( $this );
	}
}

Ai para usar, você faz assim:

 

if ( isset( $_FILES[ "imagem" ][ "tmp_name" ] ) && file_exists( $_FILES[ "imagem" ][ "tmp_name" ] ) ){
	$imagem	= new Image();
	$imagem
		->load( $_FILES[ "imagem" ][ "tmp_name" ] )
		->resize( 750 , 520 )
		->save( "imagens/sua_imagem.jpg" );
}

Você nem precisa do move_uploaded_file para trabalhar com ela...

Compartilhar este post


Link para o post
Compartilhar em outros sites

não consigo fazer, estar a por isto tudo no mesmo ficheiro?

 

Bruno, o ideal é salvar a classe Image em um arquivo chamado Image.php e então usar require para carregar a classe. Outra coisa que você deve fazer também é confirmar se tem a GD instalada:

 

if ( function_exists( "gd_info" ) ){
    require_once( "Image.php" ); //aqui coloca o caminho completo para o arquivo da classe
    
    /**
     * Aqui, $_FILES[ "imagem" ] referencia o nome do campo do seu formulário, se o nome do campo for diferente de imagem você deve trocar:
     * <input name="imagem"....
     */
    if ( isset( $_FILES[ "imagem" ][ "tmp_name" ] ) && file_exists( $_FILES[ "imagem" ][ "tmp_name" ] ) ){
        $imagem = new Image();
        $imagem
                ->load( $_FILES[ "imagem" ][ "tmp_name" ] )
                ->resize( 750 , 520 )
                ->save( "imagens/sua_imagem.jpg" );
    }
} else {
    printf( "Você não tem a GD instalada" );
}

Se você não tiver a GD instalada vá até: http://br.php.net/manual/en/image.setup.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu tenho um file:

imagem.php

 * Carregamento e redimensionamento de imagens
 */
class Image {
        /**
         * Extensão padrão da imagem, caso nenhuma seja fornecida
         */
        const DEFAULT_IMG_EXT                   = "jpg";

        /**
         * Qualidade padrão quando formos salvar um jpg
         */
        const DEFAULT_IMG_QUALITY               = 75;

        /**
         * Utilizado para redimensionar uma imagem mantendo o aspecto dela
         */
        const RESIZE_MAINTAIN_ASPECT    = 0;

        /**
         * Utilizado para redimensionar uma imagem diminuindo a caixa
         */
        const RESIZE_BOX                                = 1;

        /**
         * A extensão da imagem
         * @var string
         */
        protected $ext                                  = self::DEFAULT_IMG_EXT;

        /**
         * Recurso gerado pela GD
         * @var resource
         */
        protected $img;

        /**
         * O nome do arquivo
         * @var string
         */
        public $file;

        /**
         * Uma imagem que será utilizada como pano de fundo
         * @var string
         */
        public $background;

        /**
         * Qualidade que será utilizado para salvar uma imagem
         * @var integer
         */
        public $quality                         = self::DEFAULT_IMG_QUALITY;

        /**
         * Largura da imagem
         * @var integer
         */
        public $width;

        /**
         * Altura da imagem
         * @var integer
         */
        public $height;

        /**
         * Cria um novo objeto que será utilizado para manipular a imagem
         */
        public function __construct(){
                $this->img                      = null;
                $this->file                     = "";
                $this->background       = "";
                $this->width            = 0;
                $this->height           = 0;
        }

        /**
         * Carrega a imagem
         * @param $string $file O nome do arquivo que será carregado
         * @return Image Instância do objeto criado
         */
        public function load( $file ){
                $match = array();

                if ( file_exists( $file ) ){
                        $this->file     = $file;

                        if ( preg_match( "/[^\\.]*\\.(\\w*)/" , $file , $match ) )
                                $this->ext = strtolower( $match[ 1 ] );

                        switch ( $this->ext ){
                                case "png" :
                                        $this->img = @imagecreatefrompng( $this->file );
                                        break;
                                case "gif" :
                                        $this->img = @imagecreatefromgif( $this->file );
                                        break;
                                case "jpg" :
                                default:
                                        $this->img = @imagecreatefromjpeg( $this->file );
                                        break;
                        }

                        $this->width    = @imagesx( $this->img );
                        $this->height   = @imagesy( $this->img );
                }

                return( $this );
        }

        /**
         * Carrega uma imagem de uma string (normalmente utilizado com imagens salvas em banco de dados)
         * @param string $str A string que contém a imagem
         * @return Image Instância do objeto criado
         */
        public function loadStr( $str ){
                $this->img = @imagecreatefromstring( $str );

                $this->width    = @imagesx( $this->img );
                $this->height   = @imagesy( $this->img );
                
                return( $this );
        }

        /**
         * Destroi o recurso da imagem gerado pela GD
         * @return Image Instância do objeto criado
         */
        public function destroy(){
                if ( $this->img )
                        @imagedestroy( $this->img );

                return( $this );
        }

        /**
         * Redimensiona a imagem
         * @param integer $width A nova largura da imagem
         * @param integer $height A nova altura da imagem
         * @param integer $type Define se vamos manter o aspecto ou se vamos redimensionar a caixa
         * @return Image Instância do objeto criado
         */
        public function resize( $width = null , $height = null , $type = self::RESIZE_MAINTAIN_ASPECT ){
                $oldWidth       = @imagesx( $this->img );
                $oldHeight      = @imagesy( $this->img );
                $oldRatio       = $oldWidth / $oldHeight;
                $newWidth       = $this->width;
                $newHeight      = $this->height;

                if ( $width             ) $newWidth             = $width;
                if ( $height    ) $newHeight    = $height;

                $tempimg = @imagecreatetruecolor( $newWidth , $newHeight );
                @imagecolorallocate( $tempimg ,255 , 255 , 255 );

                switch ( $type ){
                        case self::RESIZE_MAINTAIN_ASPECT:
                                if ( ( $newWidth / $newHeight ) > $oldRatio ){
                                        $newWidth = $newHeight * $oldRatio;
                                } else {
                                        $newHeight = $newWidth / $oldRatio;
                                }

                                if ( file_exists( $this->background ) ){
                                        $background = imagecreatefromjpeg( $this->background );
                                        imagecopy( $tempimg , $background , 0 , 0 , 0 , 0 , imagesx( $background ) , imagesy( $background ) );
                                        imagedestroy( $background );
                                }

                                if ( imagecopyresampled( $tempimg , $this->img , 0 , 0 , 0 , 0 , $newWidth , $newHeight , $oldWidth, $oldHeight ) )
                                        $this->img = $tempimg;

                                break;
                        case self::RESIZE_BOX:
                        default:
                                if ( imagecopyresized( $tempimg , $this->img , 0 , 0 , 0 , 0 , $newWidth , $newHeight , $oldWidth , $oldHeight ) )
                                        $this->img = $tempimg;
                                break;
                }

                $this->width    = imagesx( $this->img );
                $this->height   = imagesy( $this->img );

                return( $this );
        }

        /**
         * Salvamos a imagem para um arquivo
         * @param string $file O nome do arquivo que iremos salvar a imagem
         * @return Image Instância do objeto criado
         */
        public function save( $file = null ){
                if ( $this->img ){
                        if ( !$file ) $file = $this->file;

                        switch ( $this->ext ){
                                case "png" :
                                        @imagepng( $this->img , $file , $this->quality );
                                        break;
                                case "gif" :
                                        @imagegif( $this->img , $file , $this->quality );
                                        break;
                                case "jpg" :
                                default:
                                        @imagejpeg( $this->img , $file , $this->quality );
                                        break;
                        }
                }

                return( $this );
        }

        /**
         * Enviamos a imagem para a saída padrão
         * @return Image Instância do objeto criado
         */
        public function flush(){
                switch ( $this->ext ){
                        case "png" :
                                @imagepng( $this->img );
                                break;
                        case "gif" :
                                @imagegif( $this->img );
                                break;
                        case "jpg" :
                        default:
                                @imagejpeg( $this->img , null , $this->quality );
                                break;
                }

                return( $this );
        }

e tenho outro file HTML para o form onde vou mandar a imagem para um outro file

 

form.html

<form action="teste.php" method="get">

wwww 
  <input type="file" name="imagem" size="30" />
  <input type="submit" name="upload" value="Upload" />


</form>

e por fim

 

teste.php que recebe a imagem

 

<?php 


if ( function_exists( "gd_info" ) ){
    require_once( "Image.php" ); //aqui coloca o caminho completo para o arquivo da classe
    
    /**
     * Aqui, $_FILES[ "imagem" ] referencia o nome do campo do seu formulário, se o nome do campo for diferente de imagem você deve trocar:
     * <input name="imagem"....
     */
    if ( isset( $_FILES[ "imagem" ][ "tmp_name" ] ) && file_exists( $_FILES[ "imagem" ][ "tmp_name" ] ) ){
        $imagem = new Image();
        $imagem
                ->load( $_FILES[ "imagem" ][ "tmp_name" ] )
                ->resize( 750 , 520 )
                ->save( "imagens/sua_imagem.jpg" );
    }
} else {
    printf( "Você não tem a GD instalada" );
}


?>

mesmo assim está a dar erro

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu tenho um file:

imagem.php

 

...

 

e por fim

 

teste.php que recebe a imagem

 

 if ( function_exists( "gd_info" ) ){
     require_once( "Image.php" ); //aqui coloca o caminho completo para o arquivo da classe

...
mesmo assim está a dar erro

 

No seu teste.php você está o require_once para chamar o arquivo Image.php mas você salvou o arquivo como Imagem.php. Você deve trocar ou um ou o outro. Eu aconselho a trocar o nome do arquivo onde você salvou a classe para Image.php, sem o m e com o I do nome com letra maiúscula.

 

Se ainda assim não funcionar, você deve enviar a mensagem de erro que está recebendo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Parse error: syntax error, unexpected ';', expecting T_FUNCTION in D:\wamp\www\teste\2\Image.php on line 234

Amigo, leia o erro. Erro de sintaxe... Você escreveu alguma coisa errada... Já procurou o erro na linha descrita (234)???? O que tem nesta linha????

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Parse error: syntax error, unexpected ';', expecting T_FUNCTION in D:\wamp\www\teste\2\Image.php on line 234

 

Certo, na primeira linha do arquivo:

 

* Carregamento e redimensionamento de imagens
 */
class Image {

Está faltando o início do comentário, mude para:

 

<?
/**
 * Carregamento e redimensionamento de imagens
 */
class Image {

Lá no final do arquivo, na última linha:

case "jpg" :
                        default:
                                @imagejpeg( $this->img , null , $this->quality );
                                break;
                }

                return( $this );
        }

Está faltando uma chave, basta adicionar um } na última linha:

                return( $this );
        }
}

Acho que isso deve resolver, o código com as correções está em: http://neto.joaobatista.pastebin.com/f2e59c312

Compartilhar este post


Link para o post
Compartilhar em outros sites

desta vez não dá erro, mas não grava a imagem

o url fica após ter feito o upload

 

Bom, você precisa

 

1. verificar se você realmente tem a GD instalada, isso é fundamental !!!

2. verificar se você possui permissão de gravação na pasta de destino.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu utilizo:

 

 

class_img.php

<?php
error_reporting(E_ALL);
set_time_limit(0);
(file_exists('funcoes_class.php')) ? (require('funcoes_class.php')):false;

class Upload{
    private $arquivo;
    public  $ide;
    private $erro=array(  '0' => 'upload execultado com sucesso!',
                          '1' => 'O arquivo é maior que o permitido pelo Servidor',
                          '2' => 'O arquivo é maior que o permitido pelo formulario',
                          '3' => 'O upload do arquivo foi feito parcialmente',
                          '4' => 'Não foi feito o upload do arquivo');
                           
 public function pegar_id($idd)
    {
    $this->ide= isset($idd) ? $idd : die('Erro');
    }
    
 function Verifica_Upload()
    {
        $this->arquivo = isset($_FILES['arquivo']) ? $_FILES['arquivo']:die($this->erro[4]);
        if(!is_uploaded_file($this->arquivo['tmp_name'])) {
            return false;
        }
        $get = getimagesize($this->arquivo['tmp_name']);

        if($get['mime'] != 'image/jpeg')
        {
            die('<span style="color: white; border: solid 1px; background: red;">Extensão inválida.</span>');
        }
        return true;
    }
    function Envia_Arquivo()
    {
        if($this->Verifica_Upload()){
            $this->gera_fotos();
            return true;
        }
    }

	
    function gera_fotos()
    {
        $diretorio = 'pasta/';
        if(!is_dir($diretorio))
        {
            mkdir($diretorio,0777);
        }

        $nome_foto  = 'imagem_'.time().'.jpg';
        $nome_thumb = 'thumb_'.time().'.jpg';

        $caminho=$diretorio.$nome_foto;
        $caminho_t=$diretorio.$nome_thumb;
                //determino uma resolução maxima e se a imagem for maior ela sera reduzida
        reduz_imagem($this->arquivo['tmp_name'], 694, 460,$caminho);
                //passo o tamanho da thumbnail
        reduz_imagem($this->arquivo['tmp_name'], 120, 90,$caminho_t);

        echo "<script>alert('".$this->erro[$this->arquivo['error']]."');</script>";
        
        $ins=mysql_query("UPDATE tabela SET campo_fotogrande='$caminho_t',campo_thumb='$caminho' WHERE campo_id='$this->ide'")or die(mysql_error());
    }
  }
?>

funcoes_class.php

 

<?php
ini_set('memory_limit','64M');
function reduz_imagem($img, $max_x, $max_y, $nome_foto) {

//pega o tamanho da imagem ($original_x, $original_y)
list($width, $height) = getimagesize($img);

$original_x = $width;
$original_y = $height;

// se a largura for maior que altura
if($original_x > $original_y) {
   $porcentagem = (100 * $max_x) / $original_x;
}
else {
   $porcentagem = (100 * $max_y) / $original_y;
}

$tamanho_x = $original_x * ($porcentagem / 100);
$tamanho_y = $original_y * ($porcentagem / 100);

$image_p = imagecreatetruecolor($tamanho_x, $tamanho_y);
$image   = imagecreatefromjpeg($img);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $tamanho_x, $tamanho_y, $width, $height);


return imagejpeg($image_p, $nome_foto, 100);

}
?>

Modo de usar:

 

<?php
if($_SERVER['REQUEST_METHOD']=='POST')
{
(file_exists('class_img.php')) ? (include('class_img.php')):die('Erro ao incluir o arquivo.');

$ins=mysql_query("INSERT INTO tabela (campo1,campo2) VALUES ('{$_POST['']}','{$_POST['']}')")or die(mysql_error());

$id = mysql_insert_id();
$upload = new Upload();
$upload->pegar_id($id);
$upload->Envia_Arquivo();
}
?>

Ela funciona da seguinte forma, imagine que você tenha uma tabela, que teria que armazenar dados e uma foto com seu respectivo thumb, então a class faz o upload da foto, gera uma miniatura sem perder a proporção, e insere os dados vindos do form, depois ela da um UPDATE para salvar o path das fotos no DB de acordo o ID da inserção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema está no formulário... Veja..

<form action="teste.php" method="get">

wwww 
 <input type="file" name="imagem" size="30" />
 <input type="submit" name="upload" value="Upload" />


</form>

 

Método get e falta o enctype correto.

 

<form action="teste.php" method="post" enctype="multipart/form-data">

wwww 
 <input type="file" name="imagem" size="30" />
 <input type="submit" name="upload" value="Upload" />


</form>

 

Deve funcionar

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.