Ir para conteúdo

Arquivado

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

Carcleo

imagepng não funciona

Recommended Posts

Pessoal. Bom Dia!

Tenho o codigo abaixo que faz o upload de imagens com miniatura.

Acontece, que ele faz normalmente todos os uplods normails. Porem, quando chega nas miniaturas, as miniaturas de arquivos com extensão png não estão sendo geradas.

Ou seja, imagepng não funciona no meu código.

Alguem pode me ajudar?

Grato,

<?php
 include "../config/constantes.php";
 include "../config/conexao.php";

 $foto     = $_FILES['Filedata'];
 $nome     = $foto['name'];
 $tipo     = $foto['type'];
 $tmpname  = $foto['tmp_name'];

 $extensao = pathinfo($nome, PATHINFO_EXTENSION);

 $imagem_nome = md5(uniqid(time())).".". $extensao;

 //Diretórios de Gravação das imagens
 $caminho_normal = "../../".endereco_normal."/".$imagem_nome;
 $caminho_mini = "../../".endereco_mini."/".$imagem_nome;

 if(move_uploaded_file($tmpname, $caminho_normal))                      
 {

$parametro = $_GET["parametro"];
$inserir_fotos_string =
"
  insert into fotos (nome_fotos, id_produtos_fotos)
  values ('$imagem_nome',$parametro)
";

$inserir_fotos = $conexao->query($inserir_fotos_string);

//CRIA UMA NOVA IMAGEM
if ($tipo ="image/pjpeg") { $imagem_original = imagecreatefromjpeg($caminho_normal); }
else if ($tipo ="image/jpeg") { $imagem_original = imagecreatefromjpeg($caminho_normal); }
else if ($tipo ="image/gif") { $imagem_original = imagecreatefromgif($caminho_normal); }
else if ($tipo ="image/png") { $imagem_original = imagecreatefrompng($caminho_normal); }

//Criaçao da miniatura
//LARGURA
$largura_original = imagesx($imagem_original);
//ALTURA
$altura_original = imagesy($imagem_original);

//DEFINE OS PARÂMETROS DA MINIATURA
$largura_mini = 150;
$altura_mini = ($altura_original * $largura_mini) / $largura_original;

//CRIA O THUMBNAIL
$imagem_final = imagecreatetruecolor($largura_mini, $altura_mini);

//COPIA A IMAGEM ORIGINAL PARA DENTRO
imagecopyresampled($imagem_final, $imagem_original, 0, 0, 0, 0, $largura_mini+1, $altura_mini+1, $largura_original, $altura_original);

//SALVA A IMAGEM
if ($tipo ="image/pjpeg") { imagejpeg($imagem_final, $caminho_mini ,100); }
else if ($tipo ="image/jpeg") { imagejpeg($imagem_final, $caminho_mini ,100); }
else if ($tipo ="image/gif") { imagegif($imagem_final, $caminho_mini ,100); }
else if ($tipo ="image/png") { imagepng($imagem_final, $caminho_mini); }


//LIBERA A MEMÓRIA
imagedestroy($imagem_original);
imagedestroy($imagem_final);
 }
?>

Carlos Rocha

Compartilhar este post


Link para o post
Compartilhar em outros sites

Siga as orientações deste tópico e ative todas as exibições de erro. Após isso, teste novamente e veja se aparece algum erro.

 

Você também pode executar o código abaixo e visualizar, na seção "gd" se a extensão png está habilitada ou não

<?php
phpinfo();
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria isso:

[php_GD2]
extension=php_gd2.dll

Ou isso?

[gd]
; Tell the jpeg decode to ignore warnings and try to create
; a gd image. The warning will then be displayed as notices
; disabled by default
; http://php.net/gd.jpeg-ignore-warning
;gd.jpeg_ignore_warning = 0

Obs.: Em todo php.ini não achei a palavra png

Outra coisa, no inicio dos meu codigos sempre faço:

error_reporting(E_ALL);

O que fazer agora?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria isso:

[php_GD2]
extension=php_gd2.dll

Ou isso?

[gd]
; Tell the jpeg decode to ignore warnings and try to create
; a gd image. The warning will then be displayed as notices
; disabled by default
; http://php.net/gd.jpeg-ignore-warning
;gd.jpeg_ignore_warning = 0

Obs.: Em todo php.ini não achei a palavra png

Nenhum dos dois. Execute o script que postei, que aparecerão detalhes das configurações do php. Na seção "gd", haverá informações sobre suporte a jpeg, gif e png. É aquela informação que você tem que procurar

 

 

Outra coisa, no inicio dos meu codigos sempre faço:

error_reporting(E_ALL);

O que fazer agora?

lembre-se de mudar display_errors também

 

ini_set( 'display_errors', 1 );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Analisando o codigo com mais atenção, verifiquei que essa condição:

 

//CRIA UMA NOVA IMAGEM
if ($tipo ="image/pjpeg") { .......

Sempre retornará true. Então, nunca chegarei na condição de imagem gif ou png.

Então, os uploads serão realizados. Porem, as miniaturas de gif e png não. Somente as de jpeg e jpg serão criadas.

 

 

Como contornar esse problema?

 

Nem mesmo assim vei a funcionar:

 


...

//CRIA UMA NOVA IMAGEM
if ($tipo =="image/jpg") { $imagem_original = imagecreatefromjpeg($caminho_normal); }
else if ($tipo =="image/gif") { $imagem_original = imagecreatefromgif($caminho_normal); }
else if ($tipo =="image/png") { $imagem_original = imagecreatefrompng($caminho_normal); }

//Criaçao da miniatura
//LAGURA
$largura_original = imagesx($imagem_original);
//ALTURA
$altura_original = imagesy($imagem_original);

//DEFINE OS PARÂMETROS DA MINIATURA
$largura_mini = 150;
$altura_mini = ($altura_original * $largura_mini) / $largura_original;

//CRIA O THUMBNAIL
$imagem_final = imagecreatetruecolor($largura_mini, $altura_mini);

//COPIA A IMAGEM ORIGINAL PARA DENTRO
imagecopyresampled($imagem_final, $imagem_original, 0, 0, 0, 0, $largura_mini+1, $altura_mini+1, $largura_original, $altura_original);

//SALVA A IMAGEM
if ($tipo =="image/jpg") { imagejpeg($imagem_final, $caminho_mini ,100); }
else if ($tipo =="image/gif") { imagegif($imagem_final, $caminho_mini ,100); }
else if ($tipo =="image/png") { imagepng($imagem_final, $caminho_mini); }
...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você estava usando "=" em vez de "==". Esse era o problema de sempre retornar true.

 

 

Nem mesmo assim vei a funcionar:

//CRIA UMA NOVA IMAGEM
if ($tipo =="image/jpg") { $imagem_original = imagecreatefromjpeg($caminho_normal); }
else if ($tipo =="image/gif") { $imagem_original = imagecreatefromgif($caminho_normal); }
else if ($tipo =="image/png") { $imagem_original = imagecreatefrompng($caminho_normal); }

//Criaçao da miniatura
//LAGURA
$largura_original = imagesx($imagem_original);
//ALTURA
$altura_original = imagesy($imagem_original);

//DEFINE OS PARÂMETROS DA MINIATURA
$largura_mini = 150;
$altura_mini = ($altura_original * $largura_mini) / $largura_original;

//CRIA O THUMBNAIL
$imagem_final = imagecreatetruecolor($largura_mini, $altura_mini);

//COPIA A IMAGEM ORIGINAL PARA DENTRO
imagecopyresampled($imagem_final, $imagem_original, 0, 0, 0, 0, $largura_mini+1, $altura_mini+1, $largura_original, $altura_original);

//SALVA A IMAGEM
if ($tipo =="image/jpg") { imagejpeg($imagem_final, $caminho_mini ,100); }
else if ($tipo =="image/gif") { imagegif($imagem_final, $caminho_mini ,100); }
else if ($tipo =="image/png") { imagepng($imagem_final, $caminho_mini); }
...

 

por que não? já testou? deu erro? qual foi a saída?

adicione logs nos blocos. vai ajudar a "depurar" o programa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é.

Não tem como fazer depurar (acho) pois o php esta sendo acessado via ajax. Dái, o ajax não deixa o php mostrar os erros.

 

Veja:

<h1 style="text-align:center">Insira novas fotos para este produto</h1>
<h1> <br /></h1>
<div id="uploader"></div>
<div id="uploader_files"></div>
<h1> <br /></h1>
<a href="javascript:uploader.startUpload();">Enviar Fotos</a> | <a href="javascript:uploader.clearUploadQueue();">Cancelar todas as fotos</a><br />

E, o arquivo onde se encontra a função startUpload que é a que chama o php:

 

function multiUpload(id, filesdiv, options)
{
/**
 * Default function to create the base html that will show files
 **/
this.createBaseHtml = function()
{
 html  = '<div><div class="c30p bold">Arquivo</div><div class="c100 ac bold">Tamanho</div>';
 html += '<div class="c100 ac bold">Cancelar</div><div class="c30p bold">Progresso</div></div><div class="sep"></div>';
 html += '<div id="files_list"></div>';
 document.getElementById(filesdiv).innerHTML = html;
}
/**
 * Default function to add files to the default base html
 **/
this.onselected = function(e)
{
 for (var file in e.files)
 {
  var info = e.files[file];
  var divfile = document.createElement("div");
  divfile.id = "file_"+info.id;
  divfile.innerHTML = '<div class="c30p">'+info.name+'</div><div class="c100 ac">'+size(info.size)+'</div><div class="c100 ac"><a href="javascript:'+id+'.cancelUpload('+info.id+');">X</a></div><div class="c30p progress"><div id="progress_'+info.id+'"> </div></div><div class="sep"></div>';
  document.getElementById("files_list").appendChild(divfile);
 }
}
/**
 * Default function to remove the file from the default base html
 **/
this.onCancel = function(e)
{
 var divfile = document.getElementById("file_"+e.id);
 document.getElementById("files_list").removeChild(divfile);
}
/**
 * Default function to show the upload progress
 **/
this.onprogress = function(e)
{
 var progress = Math.ceil(Number(e.bytesLoaded / e.bytesTotal * 100));
 var div = document.getElementById("progress_"+e.id);
 var val = String(progress)+"%";
 div.innerHTML = val;
 div.style.width = val;
}
/**
 * Default function to clear the list of files
 **/
this.onClearQueue = function(e)
{
 document.getElementById("files_list").innerHTML = "";
}
this.prepareData = function(data)
{
 var strData = '';
 for (var name in data)
  strData += '&' + name + '=' + data[name];
 return escape(strData.substr(1));
}
/**
 * Default options
 */
this.op = {
 swf:               '', //'upload.swf',  path to the swf file
 script:            '', //'upload_imagem.php',  path to the upload script
 expressInstall:    null,
     debug:             true,
 scriptAccess:      'sameDomain',
 width:             137, // flash button width
 height:            27, // flash button height
 wmode:             'opaque', // flash button wmode
 method:            'POST', // method to send vars to the upload script
 data:              {}, // data object to send with each upload. ex.: { foo: 'bar' }
 maxsize:           0, // maximum file size in bytes (0 = any size)
 fileDescription:   '', // text to show in the combo box on the bottom of the selection window
 fileExtensions:    '', // Extension to allow ex.: '*.jpg;*.gif;*.png'
 createBaseHtml:    this.createBaseHtml, // Base html
 onMouseClick:      function() {}, // function to execute when the user has clicked the uploader swf
 onselectionCancel: function() {}, // function to execute when the user presses "Cancel" in the selection window
 onselected:        this.onselected, // function to execute when the user makes the selection
 onstart:           function() {}, // function to execute when the uploader starts sending a file
 onerror:           function() {}, // function to execute when an Error occurs
 onprogress:        this.onprogress, // function to execute on every progress change of a single file upload
 onCancel:          this.onCancel, // function to execute when a file upload is canceled
 onComplete:        function() {}, // function to execute when a file upload is complete
 onAllComplete:     function() {}, // function to execute when every file from the queue was sent
 onClearQueue:      this.onClearQueue, // function to execute when the queue is cleared
 callback:          function() {} // function to execute when the swf object is embeded
}
this.op = mergeRecursive(this.op, options);
var op = this.op;
DOMReady(function() { op.createBaseHtml(); });
var path = location.pathname;
path = path.split('/');
path.pop();
path = path.join('/') + '/';
var params = {};
params.id      = id;
params.path    = path;
params.script  = op.script;
params.method  = op.method;
if (op.multi)  params.multi = true;
if (op.auto)   params.auto  = true;
params.maxsize = op.maxsize;
params.desc    = op.fileDescription;
params.ext     = op.fileExtensions;
if (op.data)
 params.scriptData = this.prepareData(op.data);

swfobject.embedSWF(op.swf, id, op.width, op.height, '9.0.24', op.expressInstall, params, {'quality':'high','wmode':op.wmode,'allowScriptAccess':op.scriptAccess}, null, op.callback);
this.el = function()
{
 return document.getElementById(id);
}
this.setData = function(data)
{
 this.el().setData(this.prepareData(data));
}
this.startUpload = function()
{
 this.el().startUpload();
}
this.cancelUpload = function(fileid)
{
 this.el().cancelUpload(fileid);
}
this.clearUploadQueue = function()
{
 this.el().clearUploadQueue();
}
}
function mergeRecursive(obj1, obj2)
{
for (var p in obj2)
{
 try
 {
  if (obj2[p].constructor == Object)
   obj1[p] = mergeRecursive(obj1[p], obj2[p]);
  else
   obj1[p] = obj2[p];
 }
 catch(e)
 {
  obj1[p] = obj2[p];
 }
}
return obj1;
}
function DOMReady(f)
{
if (/(?!.*?compatible|.*?webkit)^mozilla|opera/i.test(navigator.userAgent))
 document.addEventListener("DOMContentLoaded", f, false);
else
 window.setTimeout(f,0);
}
function size(val)
{
var kb = Number(Number(val)/1024).toFixed(1);
return kb >= 1000 ? Number(kb/1024).toFixed(1) + " MB" : kb + " KB";
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tem como fazer depurar (acho) pois o php esta sendo acessado via ajax. Dái, o ajax não deixa o php mostrar os erros.

Sua aplicação acessa via ajax. Mas nada impede que você acesse a url diretamente, para testes.

Mas caso realmente não queira acessar, você pode mudar o error_handler, para salvar os erros em arquivos de logs

também pode, em vez de echo's, adicionar escritas a um arquivo de log

Compartilhar este post


Link para o post
Compartilhar em outros sites

Achei o erro. Por incrivel que pareça, o erro, não estava no php nerm nos endereços.

 

Estava na chamada à função imagejpg. Quando chamo ela, eu passo como nome da imagem, o nome que vem do forumulario.

 

Mas, assim que eu faço o upload da imagem, eu mudo o nome dela criptografando com md5. Resultado, seu nome muda para um nome com 36 caractes mais a extenção. Precico agora saber como, tirar de uma string que contem um endereço inteiro e o nome, apenas o nome. Ou seja, apartir da da ultima incidencia do carcter / na string.

 

 

 

Como fazer isso?

A string vai me dar por ecxemplo: img/produtos/normal/806bcf4ff34a98e383fe54ff2541604b.jpg

Preciso só do nome da imagem.

fia assim:

$nome_imagem_mini= explode('/', $imagem_nome);
$quantos_cortes=count($nome_imagem_mini);
$caminho_mini = "../../".endereco_mini."/".$nome_imagem_mini[$quantos_cortes];

Mas não funcionou

Compartilhar este post


Link para o post
Compartilhar em outros sites

:seta: basename

:seta: pathinfo

 


var_dump( basename( 'img/produtos/normal/806bcf4ff34a98e383fe54ff2541604b.jpg' ) );

// string '806bcf4ff34a98e383fe54ff2541604b.jpg' (length=36)


var_dump( pathinfo( 'img/produtos/normal/806bcf4ff34a98e383fe54ff2541604b.jpg', PATHINFO_BASENAME ) );

// string '806bcf4ff34a98e383fe54ff2541604b.jpg' (length=36)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem alguma coisa errada nesse código?

<?php  

 include "../config/constantes.php";
 include "../config/conexao.php"; 

 $foto     = $_FILES["Filedata"];
 $nome     = $foto["name"];
 $tipo     = $foto["type"];
 $tmpname  = $foto["tmp_name"];

 $extensao = pathinfo($nome, PATHINFO_EXTENSION); 

 $imagem_nome = md5(uniqid(time())).".". $extensao;

 //Diretórios de Gravação das imagens
 $caminho_normal = "../../".endereco_normal."/".$imagem_nome;

 if(move_uploaded_file($tmpname, $caminho_normal))                       
 {

$parametro = $_GET["parametro"];

$inserir_fotos_string = "insert into fotos (nome_fotos, id_produtos_fotos)  values ('$imagem_nome',$parametro)";
$inserir_fotos = $conexao->query($inserir_fotos_string);

//CRIA UMA NOVA IMAGEM
if ($tipo =="image/jpg") { $imagem_original = imagecreatefromjpeg($caminho_normal); }
else if ($tipo =="image/gif") { $imagem_original = imagecreatefromgif($caminho_normal); }
else if ($tipo =="image/png") { $imagem_original = imagecreatefrompng($caminho_normal); }

//Criaçao da miniatura
//LARGURA
$largura_original = imagesx($imagem_original);
//ALTURA
$altura_original = imagesy($imagem_original); 

//DEFINE OS PARÂMETROS DA MINIATURA
$largura_mini = 150;
$altura_mini = ($altura_original * $largura_mini) / $largura_original;

//CRIA O THUMBNAIL
$imagem_final = imagecreatetruecolor($largura_mini, $altura_mini); 

//COPIA A IMAGEM ORIGINAL PARA DENTRO
imagecopyresampled($imagem_final, $imagem_original, 0, 0, 0, 0, $largura_mini+1, $altura_mini+1, $largura_original, $altura_original); 

$nome_imagem_mini=basename($imagem_nome);
   $caminho_mini = "../../".endereco_mini."/".$nome_imagem_min;	

//SALVA A IMAGEM
if ($tipo =="image/jpg") { header("Content-type: image/jpg"); imagejpeg($imagem_final, $caminho_mini ,100); }
else if ($tipo =="image/gif") { header("Content-type: image/gif"); imagegif($imagem_final, $caminho_mini ,100); }
else if ($tipo =="image/png") { header("Content-type: image/png"); imagepng($imagem_final, $caminho_mini); }


//LIBERA A MEMÓRIA
imagedestroy($imagem_original);
imagedestroy($imagem_final);
 }  
?>

Porque será que o upload é feito. Mas as miniaturas não?

 

A biblioteca GD esta instalada para jpg, gif e png.

Estranho!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sabe o que que não dá para entender? É que, só as miniaturas não são geradas.

 

Daí, pra testar, eu criei um arquivo liso com o form de upload de 1 arquivo só por vez (type=file) e testei nesse

mesmo codigo. Resultado: deu certo. Tanto o upload quanto as miniaturas.

 

E agora?

 

O que fazer?

 

Os depuradores não retornar erro. O php não retorna erro.

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.