Ir para conteúdo

POWERED BY:

Arquivado

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

Diego Velox

[Resolvido] Como cortar e redimensionar uma imagem?

Recommended Posts

Bom galera estou tentando transformar imagens (wallpapers) de 1024x768 para 1280x800, estou fazendo o seguinte:

 

Antes da programação, fiz uns testes de redimensionamento no PS e vi que a altura continuará a mesma e a largura de 768 vai para 640 (-128px).

 

Dai teria que ser assim (acho), transformar 1024x768 para 1024x640 e depois aumentar para 1280x800, como é possível fazer isso?

 

Estou tentando isso a dias... já tentei com imagecopyresized, imagecopyresampled, imagecopy... mas sempre fica umas bordas (pretas) e nunca consigo.

 

 

 

Com imagecopyresized ficou esticado:

http://pastebin.com/VHcpathw

 

Quero cortar (128px de altura) pra depois redimensionar

 

 

 

Já com imagecopy cortar para 1024x640, mas não sei como fazer para transformar para 1280x800...

http://pastebin.com/Q8N94c3B

 

POR FAVOR ME AJUDEM

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, utilizo a seguinte função para criar imagens mantendo a proporção entre altura e largura:

/**
 * criarFoto($foto, $dimensaoMaxima, $nomeDoArquivo)
 *
 * $foto: Foto original (full size)
 * $dimensaoMaxima: Medida em pixel da largura/altura máxima da foto que será criada
 * $nomeDoArquivo: Nome do novo arquivo que será criado
 *
 **/
function criarFoto($foto, $dimensaoMaxima, $nomeDoArquivo)
{
	// Foto original
	$imgFullSize = imagecreatefromjpeg($foto);

	// Largura da foto original
	$larguraFullSize = imagesx($imgFullSize);

	// Altura da foto original
	$alturaFullSize = imagesy($imgFullSize);

	// Identifica o "ratio" da foto, mantendo a proporção (se a largura é menor do que a altura e vice-versa)
	if($larguraFullSize > $alturaFullSize)
	{
		$larguraNovaFoto = ($larguraFullSize < $dimensaoMaxima) ? $larguraFullSize : $dimensaoMaxima;
		$ratio = $larguraFullSize / $larguraNovaFoto;
		$alturaNovaFoto = ceil($alturaFullSize / $ratio);
	}
	else
	{
		$alturaNovaFoto = ($alturaFullSize < $dimensaoMaxima) ? $alturaFullSize : $dimensaoMaxima;
		$ratio = $alturaFullSize / $alturaNovaFoto;
		$larguraNovaFoto = ceil($larguraFullSize / $ratio);
	}

	$novaFoto = imagecreatetruecolor($larguraNovaFoto, $alturaNovaFoto);
	imagecopyresampled($novaFoto, $imgFullSize, 0, 0, 0, 0, $larguraNovaFoto, $alturaNovaFoto, $larguraFullSize, $alturaFullSize);

	imagejpeg($novaFoto, $nomeDoArquivo, 90);
	imagedestroy($novaFoto);

}
Só que essa função é mais indicada para redimensionar imagens maiores gerando imagens menores. Se você especificar uma dimensão máxima maior do que a foto original possui, a função irá criar uma foto com as mesmas dimensões da foto original.

 

Como você pretende criar imagens maiores a partir de uma imagem menor (o que não é muito recomendado visto que a qualidade das imagens geradas não são muito boas), pode utilizar essa versão:

/**
 * criarFoto($foto, $dimensaoMaxima, $nomeDoArquivo)
 *
 * $foto: Foto original (full size)
 * $dimensaoMaxima: Medida em pixel da largura/altura máxima da foto que será criada
 * $nomeDoArquivo: Nome do novo arquivo que será criado
 *
 **/
function criarFoto($foto, $dimensaoMaxima, $nomeDoArquivo)
{
	// Foto original
	$imgFullSize = imagecreatefromjpeg($foto);

	// Largura da foto original
	$larguraFullSize = imagesx($imgFullSize);

	// Altura da foto original
	$alturaFullSize = imagesy($imgFullSize);

	// Identifica o "ratio" da foto, mantendo a proporção (se a largura é menor do que a altura e vice-versa)
	if($larguraFullSize > $alturaFullSize)
	{
		$larguraNovaFoto = $dimensaoMaxima;
		$ratio = $larguraFullSize / $larguraNovaFoto;
		$alturaNovaFoto = ceil($alturaFullSize / $ratio);
	}
	else
	{
		$alturaNovaFoto = $dimensaoMaxima;
		$ratio = $alturaFullSize / $alturaNovaFoto;
		$larguraNovaFoto = ceil($larguraFullSize / $ratio);
	}

	$novaFoto = imagecreatetruecolor($larguraNovaFoto, $alturaNovaFoto);
	imagecopyresampled($novaFoto, $imgFullSize, 0, 0, 0, 0, $larguraNovaFoto, $alturaNovaFoto, $larguraFullSize, $alturaFullSize);

	imagejpeg($novaFoto, $nomeDoArquivo, 90);
	imagedestroy($novaFoto);

}
A diferença entre a primeira e a segunda versão é que a largura e a altura da nova foto será igual ao especificado em $dimensaoMaxima, que é o segundo parâmetro da função. Exemplo de utilização:

criarFoto("foto-original.jpg", 1600, "nova-foto.jpg");

Bem, como falei anteriormente, essa função trabalha mantendo a proporção entre largura e altura. Como você precisa aplicar um crop para gerar wallpapers widescreen, então basta utilizar a função que passei como base...

 

Bom, espero que isso lhe ajude de alguma forma.

 

 

http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui fazer o que queria, mas a resolução ficou um pouquinho ruim, será que tem como melhorar a resolução? segue o código:

 

<?php
// File and new size
$filename = 'http://www.scarros.com.br/sistemas/postarwallpapers/wallpapers/lotus-esprit-1-wallpaper-1024x768.jpg';

// Content type
header('Content-type: image/jpeg');

// Get new sizes
list($width, $height) = getimagesize($filename);
$newwidth = 1280;
$newheight = 800;

// Load
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);

// Resize
imagecopyresized($thumb, $source, 0, 0, 0, 64, $newwidth, $newheight, $width, 640);

// Output
imagejpeg($thumb);
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para controlar a qualidade do arquivo final, informe o nível dessa qualidade na função imagejpeg:

// Output
imagejpeg($thumb, NULL, 90);
Neste exemplo utilizei o fator 90, que oferece ótimos resultados. Se quiser, teste com outros valores (de 0 a 100) e verifique a qualidade do arquivo final, sempre observando o tamanho do arquivo gerado para poder escolher a melhor opção (boa qualidade com tamanho de arquivo pequeno).

 

http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para controlar a qualidade do arquivo final, informe o nível dessa qualidade na função imagejpeg:

// Output
imagejpeg($thumb, NULL, 90);
Neste exemplo utilizei o fator 90, que oferece ótimos resultados. Se quiser, teste com outros valores (de 0 a 100) e verifique a qualidade do arquivo final, sempre observando o tamanho do arquivo gerado para poder escolher a melhor opção (boa qualidade com tamanho de arquivo pequeno).

 

http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

 

Coloquei o que falou com "100" e mesmo assim não ficou perfeito igual se corta no photoshop ou outro programa de edição...

Compartilhar este post


Link para o post
Compartilhar em outros sites

De fato, isso nunca iria acontecer, pois estamos lidando com uma linguagem dinâmica, bem diferente de um software gráfico como o Photoshop. A meu ver, o problema está em criar uma imagem maior a partir de outra menor... Esse deve ser o problema...

 

Para tirar essa dúvida, faça o contrário, utilize uma imagem grande como original e gere uma menor com as funções do PHP, e pode até utilizar o fator 100 de qualidade... Depois compare os resultados...

 

http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Encontrei a SOLUÇÃO para caso alguém um dia precise, está aqui:

 

<?php
$imagem = $_GET['imagem'];
$resolucao = $_GET['resolucao'];
$filename = "seusite/sistemas/postarwallpapers/wallpapers/$imagem";
if($resolucao=='1024x768'){
echo '<img src="'.$filename.'">';
}
else{
ini_set("memory_limit", "16M");
header('Content-type: image/jpeg');

$source = imagecreatefromjpeg($filename);

switch($resolucao){
case '1280x800':
$novaLargura = 1280;
$novaAltura = 800;
$newwidth2 = 1024;
$newheight2 = 640;
$top = 64;
$left = 0;
break;
case '1440x900':
$novaLargura = 1440;
$novaAltura = 900;
$newwidth2 = 1024;
$newheight2 = 640;
$top = 64;
$left = 0;
break;
case '1280x1024':
$novaLargura = 1280;
$novaAltura = 1024;
$newwidth2 = 960;
$newheight2 = 768;
$top = 0;
$left = 32;
break;
case '1366x768':
$novaLargura = 1366;
$novaAltura = 768;
$newwidth2 = 960;
$newheight2 = 768;
$top = 0;
$left = 32;
break;
}

$larguraOriginal = imagesx($source);
$alguraOriginal = imagesy($source);

$larguraCalc = $larguraOriginal / $novaLargura;
$alturaCalc = $alguraOriginal / $novaAltura;

$min = min($larguraCalc, $alturaCalc);
$xt = $min * $novaLargura;
$x1 = ($larguraOriginal - $xt) / 2;
$x2 = $larguraOriginal - $x1;
$yt = $min * $novaAltura;
$y1 = ($alguraOriginal - $yt) / 2;
$y2 = $alguraOriginal - $y1;
$x1 = (int) $x1;
$x2 = (int) $x2;
$y1 = (int) $y1;
$y2 = (int) $y2;

$thumb = imagecreatetruecolor($novaLargura, $novaAltura);

// modifica..
imagecopyresampled($thumb, $source, 0, 0, $x1, $y1, $novaLargura, $novaAltura, $x2-$x1, $y2-$y1);

// finaliza, com qualidade 100%. :)
imagejpeg($thumb, "", 100);
}
?>

Adaptei o código com as 5 resoluções mais usadas hoje (15/09/2010), então agradeço a todos que tentaram me ajudar aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Diego,

 

Eu ja tive o mesmo problema, porem no meu caso eu precisava dar um Drop na imagem em um determinado lugar para criar um thumb

Ai vem o problema, Thumb com 150x150 pixel e a imagem maior com 600x400pixel...

 

Para solucionar isso, eu andei pesquisando e achei essa classe, muito boa, tem export pra tudo que você imaginar, vale conferir isso me ajuda a uns 3/4 anos

 

Abs,

 

Boa Sorte!

 

class.upload.php

http://www.verot.net/php_class_upload.htm?PHPSESSID=2dacfe10e33e0a415095007e0db0a6e1

 

Alguns exemplos da classe funcionando

http://www.verot.net/php_class_upload_samples.htm

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.