Jump to content


Photo

Cálculo De Largura Proporcional De Uma Imagem...


  • Faça o login para participar
11 replies to this topic

#1 cassiano designer

cassiano designer

    Normal

  • Usuários
  • 108 posts
  • Sexo:Masculino
  • Localidade:São Mateus - ES

Posted 06/12/2007, 21:58

Pessoal, to com um probleminha...

tenho esse script pra redimensionar imagem...
<?php
header("Content-type: image/jpeg");

# Informa a imagem a ser redimensionada
$img	  = imagecreatefromjpeg($_GET['imagem']);

# Informações originais sobre a imagem
$largurao = imagesx ($img); // largura original
$alturao  = imagesy ($img); // altura original
$larguran = 400; // largura nova
$alturan  = 300; // altura nova

#Criando a nova imagem
$nova	 = imagecreatetruecolor ($larguran, $alturan);
imagecopyresized ($nova, $img, 0, 0, 0, 0, $larguran, $alturan, $largurao, $alturao);
imagejpeg ($nova);
imagedestroy ($nova);
imagedestroy ($img);
?>

Do jeito que está aí, tá funcionando...

Mas quero mudar a $larguran, deixando seu valor sempre proporcional, independente do tamanho original da imagem...

fiz o cálculo da seguinte forma...

$larguran = ($largurao * $alturan) / $alturao

mas dá dando erro no script, o cálculo está correto...
mas o script não ta funcionando....

dá o seguinte erro...

Warning: imagecreatetruecolor() [function.imagecreatetruecolor]: Invalid image dimensions in C:\Arquivos de programas\Apache Group\Apache\htdocs\v2.0\administracao\galerias\redimensiona_foto.php on line 14

Warning: imagecopyresized(): supplied argument is not a valid Image resource in C:\Arquivos de programas\Apache Group\Apache\htdocs\v2.0\administracao\galerias\redimensiona_foto.php on line 15

Warning: imagejpeg(): supplied argument is not a valid Image resource in C:\Arquivos de programas\Apache Group\Apache\htdocs\v2.0\administracao\galerias\redimensiona_foto.php on line 16

Warning: imagedestroy(): supplied argument is not a valid Image resource in C:\Arquivos de programas\Apache Group\Apache\htdocs\v2.0\administracao\galerias\redimensiona_foto.php on line 17


Ah, e outra coisa, as imagens estão ficando com a qualidade não muito boa...
tem como ajustar isso?

Edição feita por: cassiano designer, 06/12/2007, 22:00.

##### "O seu maior desafio é se aprimorar para ser... você mesmo!" #####
CASSIANODESIGNER.COM - Desenvolvimento Web

#2 § Kenshin §

§ Kenshin §

    I'm coming back...!

  • Usuários
  • 574 posts
  • Sexo:Masculino
  • Localidade:BA
  • Interesses:Sou fã de linguagens direcionadas para a web, como php, (x)html, xml, wml.
    Também gosto de webdesign e ultimamente tenho me dedicado mais a aprender css, mysql, javascript, ajax e actionscript.
    Trabalho com os programas Dreamweaver, Illustrator e Flash.

Posted 06/12/2007, 22:19

$larguran = ($largurao * $alturan) / $alturao
so por curiosidade, o que aconteceria se o resultado dessa conta for fracao?
num me lembro de ter visto imagem com 103,2px x 115,4px, por exemplo.
ate porque o pixel eh a menor unidade que forma uma imagem no monitor, nao pode ser dividido.

tem arredondar os valores de $larguran, usando round():

$larguran = round($largurao * $alturan / $alturao)

ps: multiplicacao e divisao nao precisam de ().
nao importa a ordem, o resultado eh o mesmo.

vlw ^_^
Web Developer / Web Designer / Information Architect
"Living to learn... learning to live!"
Useful links: Rules | Search

#3 cassiano designer

cassiano designer

    Normal

  • Usuários
  • 108 posts
  • Sexo:Masculino
  • Localidade:São Mateus - ES

Posted 06/12/2007, 22:25

resolvi...
me deu uma louca aqui e mudei isso...
$larguran = $larguran = ($largurao * $alturan) / $alturao; // largura nova
$alturan  = 300; // altura nova

para isso...
$alturan   = 300; // altura nova
$larguran = ($largurao * $alturan) / $alturao; // largura nova
isso mesmo hahaha
só troquei as variáveis posição...
agora funcionou...

e sobre a qualidade da imagem também achei a solução...
imagejpeg ($nova, '', 95);

* Editado

so por curiosidade, o que aconteceria se o resultado dessa conta for fracao?
num me lembro de ter visto imagem com 103,2px x 115,4px, por exemplo.
ate porque o pixel eh a menor unidade que forma uma imagem no monitor, nao pode ser dividido.

o cálculo ta certo...

por ex:

$larguran = ($largurao(640) * $alturan(300)) / $alturao(480)


640 x 300 / 480 = 400...

Edição feita por: cassiano designer, 06/12/2007, 22:26.

##### "O seu maior desafio é se aprimorar para ser... você mesmo!" #####
CASSIANODESIGNER.COM - Desenvolvimento Web

#4 § Kenshin §

§ Kenshin §

    I'm coming back...!

  • Usuários
  • 574 posts
  • Sexo:Masculino
  • Localidade:BA
  • Interesses:Sou fã de linguagens direcionadas para a web, como php, (x)html, xml, wml.
    Também gosto de webdesign e ultimamente tenho me dedicado mais a aprender css, mysql, javascript, ajax e actionscript.
    Trabalho com os programas Dreamweaver, Illustrator e Flash.

Posted 06/12/2007, 22:38

para isso...

$alturan   = 300; // altura nova
$larguran = ($largurao * $alturan) / $alturao; // largura nova

realmente, me passei nisso tambem, voce estava usando uma variavel nao declarada na formula.

o cálculo ta certo...

por ex:

$larguran = ($largurao(640) * $alturan(300)) / $alturao(480)


640 x 300 / 480 = 400...

o que eu quiz dizer eh que pode aparecer uma imagem que tenha certas dimensoes que quando usadas na formula resultem num numero fracionario, so isso :P

vlw ^_^
Web Developer / Web Designer / Information Architect
"Living to learn... learning to live!"
Useful links: Rules | Search

#5 Crab

Crab

    Da paz, mas preparado para Guerra

  • Ex-Admins
  • 2521 posts
  • Sexo:Masculino
  • Localidade:Florianópolis - SC
  • Interesses:Desenvolvimento Gráfico e Web.

Posted 07/12/2007, 15:21

NA verdade essa ordem não importa cassiano...

O que deve ser visto é que deve ser assim:

Se vc tem a Nova Largura você precisa descobrir a Nova Altura certo?

Então o cálculo seria assim:

$altura_original = imgesy("imagem.jpg");
$largura_original = imgesx("imagem.jpg");

$nova_largura = 400;

$nova_altura = ($altura_original * $nova_largura) / $largura_original;

Agora se vc tem a Nova Altura vc precisa descobrir a Nova Largura certo?

Então o cálculo seria assim:
$altura_original = imgesy("imagem.jpg");
$largura_original = imgesx("imagem.jpg");

$nova_altura = 300;

$nova_largura = ($largura_original * $nova_largura) / $altura_original;

Analise os códigos e veja as diferenças...

Agora se vc tem a Nova Altura e Nova Largura vc terá liberdade de escolha de decisão e ainda pode brincar mais se quiser

(y)Até mais

#6 savior

savior

    Campanha [codebox], use ou morra :D

  • Usuários
  • 1229 posts
  • Sexo:Masculino
  • Localidade:Curitiba, PR - Brasil
  • Interesses:Na vida ;P

Posted 08/12/2007, 00:23

Em alguns casos só definindo a largura da imagem o próprio navegador calcula a altura proporcional. Vide que alguns mods de redimensionamento de imagens pro próprio IPB utilizan esse recurso apenas :)

[lastfm] [blog]

Campanha codebox: use-a ou morra!
bfmaster_duran[at]yahoo.com.br


#7 Crab

Crab

    Da paz, mas preparado para Guerra

  • Ex-Admins
  • 2521 posts
  • Sexo:Masculino
  • Localidade:Florianópolis - SC
  • Interesses:Desenvolvimento Gráfico e Web.

Posted 08/12/2007, 00:30

mas aí os bytes permanecem e o carregamento perde velocidade...

:blink: se vc reduz realmente o tamanho e salva esta imagem redimensionada ... na hora de carregar ficará mais rápido do que forçar o redimencionamento sem reduzir o tamanho em byte conforme os navegadores fazem... ou não é assimq ue eles fazem ??

Sem dizer que essas reduções que os navegadores fazem estoura toda a imagem...

Mas se eu estiver enganado por favor desculpe... não ando lendo muito nos últimos tempos... :D

(y) Até mais

#8 savior

savior

    Campanha [codebox], use ou morra :D

  • Usuários
  • 1229 posts
  • Sexo:Masculino
  • Localidade:Curitiba, PR - Brasil
  • Interesses:Na vida ;P

Posted 08/12/2007, 00:39

Na verdade ele faz o mesmo calculo proporcional que o código php. Se estourarno navegador, vai estourar com o php...

E ninguem aqui citou processamento de bytes anteriormente, só foi uma idéia comentada <_<`

Eu uso essa lib para trabalhar com redimensionamento de imagens, nao sou muito fã de criar minha própria roda :P
http://vagh.armdex.com/tnimg

Na verdade sou sempre a favor de criar imagens já prontas com as dimensões especificadas nos projetos, sem passar por algum processamento server-side/client-side (y)

[]`s

[lastfm] [blog]

Campanha codebox: use-a ou morra!
bfmaster_duran[at]yahoo.com.br


#9 Crab

Crab

    Da paz, mas preparado para Guerra

  • Ex-Admins
  • 2521 posts
  • Sexo:Masculino
  • Localidade:Florianópolis - SC
  • Interesses:Desenvolvimento Gráfico e Web.

Posted 08/12/2007, 14:08

Na verdade ele faz o mesmo calculo proporcional que o código php. Se estourarno navegador, vai estourar com o php...

E ninguem aqui citou processamento de bytes anteriormente, só foi uma idéia comentada <_<`


Eu uso o FireFox e nunca tive ativado essa parada de redimensionar ao tamanho que seja toda visível sem rolagem... sei que no IE tem isso pois já vi.. e como disse a imagem ficam meio estranha... parece que em alguns pontos da imagem alguns pixels se amontoam e a imagem fica meio embaralhada... sutil mas visível.

Quanto ao tamanho em bytes :D

Bom ele citou qualidade... qualidade maior, qualidade menor envolve resolução e resolução maior ou menor envolve mais bytes menos bytes... ;)

Na verdade sou sempre a favor de criar imagens já prontas com as dimensões especificadas nos projetos, sem passar por algum processamento server-side/client-side (y)


Realmente para alguns casos nada melhor do que ter um padrão pré-definido para algumas ações, ajuda muito mas nem sempre é possível...

Um exemplo são galerias de imagens administradas por usuários que não conhecem a programação do sistema, muitas vezes são apenas clientes que contrataram o desenvolvimento para poderem criar suas galerias e mandar suas fotos, algumas vezes digitalizadas e que não seguem um padrão proporcional em tamanho... e muito menos saberem trabalhar com softwares que fazem tratamento de imagens em lote como o PSD que pode-se programar um action e efetuar a mesma ação em centenas de imagens que seguem o mesmo padrão de tratamento e redimensionamento.

Voltando ao Post ... um calculo simples como o mencionado, alguns posts acima, não resolveria muitas destas deformidades nas imagens... sem a utilização de uma função que efetuasse um crop na imagem.

Enfim... umas das coisas que eu mais gosto no PHP é a GD... não sei quase nada para falar a verdade, mas procuro fazer algumas experiências e a capacidade que ela tem é enorme, basta o programador ter uma boa criatividade e poderá fazer verdadeiras obras de arte só com PHP /GD

(y)Até mais

#10 savior

savior

    Campanha [codebox], use ou morra :D

  • Usuários
  • 1229 posts
  • Sexo:Masculino
  • Localidade:Curitiba, PR - Brasil
  • Interesses:Na vida ;P

Posted 09/12/2007, 00:57

Com imagem, prefiro trabalhar com ImageMagic, não vem default com o php, é um sofrimente instalar/fazer funcionar, sem documentaçao :unsure:
Mas vale a pena depois pelo o que ela permite fazer

Lá vem você, ó Crab com o crop ... :P

Pra isso dá pra usar isso: http://www.impliedby...ize-wizard.html


No meu trabalho eles tem pré-moldado, um sistema de download upload que nao faz resize das imagens, n tem nem como passar por parametro ... dae em algumas partes do site tem que usar a imagem em 110 x 85px, mas a imagem tem 10x mais de tamanho que isso, dae tive que usar uma classe pra ler a imagem e gerar uma redimensionada dinamcamente, mas nao prefiro dessa forma, gosto que na hora do upload da imagem, faça o rizese resize de acordo com o que eu informar por parâmetro, bem melhor por usuario final :)

[]`s

Edição feita por: savior, 09/12/2007, 01:01.
Puta que pariu, sono faz a gente ficar analfabeto e loco x__x'

[lastfm] [blog]

Campanha codebox: use-a ou morra!
bfmaster_duran[at]yahoo.com.br


#11 Crab

Crab

    Da paz, mas preparado para Guerra

  • Ex-Admins
  • 2521 posts
  • Sexo:Masculino
  • Localidade:Florianópolis - SC
  • Interesses:Desenvolvimento Gráfico e Web.

Posted 09/12/2007, 11:20

vou dar uma olhada no link ;)

Pois é... eu prefiro assim tbm gravar já no tamanho que qeuro sa saída ... e caso tenha que redimensionar tbm gravo uma miniatura que para não distorcer... eu redimensionao a maior até alcançar a largura ou altura que eu queira... na primeira que chegar para e corta ou as laterais ou topo e base.. dependendo se a imagem é horizontal ou vertical...

Assim a miniatura não fica distorcida e a ampliada fica na integra.

Mas isso para galeria de imagens que estou desenvolvendo a 1 ano já começou pog mas vai melhorando aos poucos :D quando chegar na versão 1.0 já vai estar melhor :D

Praticando e aprendendo...

Essa de reinventar a roda é meio subjetivo... pois todo dia empresas relacionadas estão envolvidas com o desenvolvimento de pneus e rodas mais resistentes entre outras características... :D

Claro que não precisamos inventar no que nos basear já que o princípio de que a roda sendo em círculo e não quadrada já está provada que o desempenho é maior... mas baseado nesse princípio podemos recomeçar algo novo sim... minha opinião

vou ver esse link que passou... :)

(y) Até mais

#12 bimonti

bimonti

    Super Veterano

  • Usuários
  • 2654 posts
  • Sexo:Masculino

Posted 10/12/2007, 11:18

Eu uso essa taxa de conversão:

// Pega os tamanhos originais
			list($width, $height) = getimagesize($this->tempName);

			// Cria uma taxa proporcional para conversão
			$tax = $width / $height;
			if($tax < 1){
				$newWidth = round($size*$tax);
				$newHeight = $size;
			}else{
				$newWidth = $size;
				$newHeight = round($size/$tax);
			}

$size seria o tamanho máximo de um thumb, independente se é horizontal ou vertical.
WebFórum - Equipe de Desenvolvimento - Monitor
Posted Image
Yeah I do have some stories, and it's true I want all the glory ...




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq