Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Tenho um script que faz upload de imagens e preciso criar uma cópia rediemsionada desta imagem.
Tentei o seguinte:
$nome_final = md5(time()).'_imagem.jpg';
$new_width = 125;
$new_height = 125;
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($nome_final);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $largura, $altura);
A imagem original é carregada na pasta. Mas a cópia não.
tenta acrescentar ao final do código a função imagejpeg
fica assim só acrescenta o caminho para salvar na $destino.
imagejpeg($image_p,$destino,75);
rockrgo,não deu certo. Vou colocar o script inteiro para ver se ajuda:
<?php
session_start();
if(isset($_SESSION['admin']) && $_SESSION['admin'] == true ) {
if ($_FILES['arquivo']['name'] == "") {
echo "<script>alert('Voce não carregou o arquivo.');history.go(-1);</script>";
}else if ($_POST['galeria'] == ""){
echo "<script>alert('Selecione a galeria.');history.go(-1);</script>";
}else{
$_UP['pasta'] = '../teste/';
$_UP['tamanho'] = 1024 * 1024; // 1Mb
list($largura, $altura) = getimagesize($_FILES['arquivo']['tmp_name']);
$_UP['altura'] = 700;
$_UP['extensoes'] = array('jpg', 'png', 'gif');
$_UP['renomeia'] = true;
$_UP['erros'][0] = 'Não houve erro';
$_UP['erros'][1] = 'O arquivo no upload é maior do que o limite do PHP';
$_UP['erros'][2] = 'O arquivo ultrapassa o limite de tamanho especifiado no HTML';
$_UP['erros'][3] = 'O upload do arquivo foi feito parcialmente';
$_UP['erros'][4] = 'Não foi feito o upload do arquivo';
if ($_FILES['arquivo']['error'] != 0) {
die("Não foi possível fazer o upload, erro:<br />" . $_UP['erros'][$_FILES['arquivo']['error']]);
exit;
}
$extensao = strtolower(end(explode('.', $_FILES['arquivo']['name'])));
if (array_search($extensao, $_UP['extensoes']) === false) {
echo "<script>alert('Por favor, envie arquivos com as seguintes extensões: jpg, png ou gif.');history.go(-1);</script>";
}
else if ($_UP['tamanho'] < $_FILES['arquivo']['size']) {
echo "<script>alert('O arquivo enviado é muito grande, envie arquivos de até 1Mb.');history.go(-1);</script>";
}
else if ($altura != $_UP['altura']) {
echo "<script>alert('A imagem deve ter 700px de altura.');history.go(-1);</script>";
}
else {
if ($_UP['renomeia'] == true) {
$nome_final = md5(time()).'_imagem.jpg';
$new_width = 125;
$new_height = 125;
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($nome_final);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $largura, $altura);
imagejpeg($image_p,$_UP['pasta'],75);
}
if (move_uploaded_file($_FILES['arquivo']['tmp_name'], $_UP['pasta'] . $nome_final)) {
require_once('../connecting.php');
$stmt = $conn->prepare('INSERT INTO teste (galeria, imagem, largura, altura) VALUES(:galeria, :imagem, :largura, :altura)'); ':galeria' => $_POST['galeria'],
':imagem' => $nome_final,
':largura' => $largura,
':altura' => $altura,
));
header("Location: upload.php?addImagem=true");
} else {
echo "Não foi possível enviar o arquivo, tente novamente";
}
}
}
}else{
header("Location: index.php?login=false");
}
?>$nome_final = md5(time()).'_imagem.jpg';
$image = imagecreatefromjpeg($nome_final);
$new_width = 125;
$new_height = 125;
$image_p = imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $largura, $altura);
imagejpeg($image_p,$_UP['pasta'],75);
}
tenta assim como coloquei.....esse script ta retornando algum erro ? ou só não cria a cópia?
rockrgo, não está retornando nenhum erro. Mas ele não cria, ou pelo menos não envia, o arquivo copiado para a pasta. Só o original.
é porque aqui só está sendo passado o caminho.
imagejpeg($image_p,$_UP['pasta'],75);
o caminho deve conter junto o nome da imagem
exemplo:
$caminho = "../teste/imagem.jpg";
rockrgo,
Consegui salvar uma cópia do arquivo, mas apareceram alguns problemas:
1. O arquivo está preto.
2. Tentei usar o mesmo sistema de nomeação que uso para o arquivoi original e não deu certo:
$new_width = 125;
$new_height = 125;
$image_p = imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $largura, $altura);
$image_p = md5(time()).'_thumb.jpg';
imagejpeg($image_p,"../teste/".$image_p,75);Oque o nosso amigo escreveu lah em cima esta correto! Mais no imagecreatefromjpeg deveria especificar o arquivo que foi enviado não?
$nome_final = md5(time()).'_imagem.jpg';
$image = imagecreatefromjpeg($_FILES['arquivo']['tmp_name']); //Nesta Linha
$new_width = 125;
$new_height = 125;
$image_p = imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $largura, $altura); imagejpeg($image_p,$_UP['pasta'],75); }
dica que lhe Dou!
$validos = array("image/jpeg", "image/pjpeg", "image/png", "image/gif");
$extensao = $_FILES['arquivo']['type'];
if(!(in_array($extensao, $validos))){
//seu erro
}
Dellacurtais,
Fiquei em dúvida agora: é necessário usar imagecreatefromjpeg e o imagecreatetruecolor juntos? Um só não basta?
Nesta linha:
$image = imagecreatefromjpeg($_FILES['arquivo']['tmp_name']);
Você copia a imagem do upload, certo?
Qual a necessidade desta linha?
$image_p = imagecreatetruecolor($new_width, $new_height);
>
Qual a necessidade desta linha?
$image_p = imagecreatetruecolor($new_width, $new_height);
esta linha está criando o identificador de imagem com as novas dimensões....ela que está criando a imagem preta que vc disse!
não tinha percebido este detalhe que o amigo Dellacurtais mencionou, mas acho que é por isso q não está copiando a imagem....nesta linha tem que passar o endereço completo da imagem original que vai ser copiada.
$image = imagecreatefromjpeg($_FILES['arquivo']['tmp_name']); //Nesta Linha
rockrgo, entendi.
O problema é que agora, com o código do Dellacurtais, nenhuma das duas imagens está sendo salva.
este exemplo funciona corretamente, mas ele grava na mesma imagem de origem. Vê se com base nele vc consegue corrigir o seu script
<?php
$destino = "../catalogos/avioes/mel1.jpg";
$origem = imagecreatefromjpeg("../catalogos/avioes/mel1.jpg");
$origem_x=imagesx($origem);//pega o width da imagem de origem
$origem_y=imagesy($origem);//pega o height da imagem de origem
$wid_final = $origem_x * 0.70;
$hei_final = $origem_y * 0.70;
$thumb = imagecreatetruecolor($wid_final, $hei_final );
imagecopyresampled($thumb , $origem, 0, 0, 0, 0, $wid_final, $hei_final, $origem_x, $origem_y);
imagejpeg($thumb,$destino,75);
imagedestroy($origem);
imagedestroy($thumb);
?>rockrgo, parece que agora deu certo:
$nome_final = md5(time()).'_imagem.jpg';
$destino = $_UP['pasta'] . md5(time()).'_thumb.jpg';
$origem = imagecreatefromjpeg($_FILES['arquivo']['tmp_name']);
$width_thumb = 125;
$height_thumb = 125;
$thumb = imagecreatetruecolor($width_thumb, $height_thumb );
imagecopyresampled($thumb , $origem, 0, 0, 0, 0, $width_thumb, $height_thumb, $largura, $altura);
imagejpeg($thumb,$destino,75);
Uma dúvida: é necessário incluir essas duas linhas?
imagedestroy($origem);
imagedestroy($thumb);>
Uma dúvida: é necessário incluir essas duas linhas?
imagedestroy($origem);
imagedestroy($thumb);
é bom utilizar sim, porque ela libera o espaço na memória utilizado pela imagecreate...isso melhora o desempenho do sistema.
Entendi. Só uma última dúvida:
Se eu defino uma largura fixa para o thumb
$width_thumb = 125;
Como eu defino uma altura proporcional?
assim
$origem_x=imagesx($origem);//pega o width da imagem de origem
$origem_y=imagesy($origem);//pega o height da imagem de origem
$wid_final = $origem_x * 0.70;
$hei_final = $origem_y * 0.70;
ele pega os valores originais da imagem e neste caso está reduzindo em 30%.....aí vc ajusta qual a porcentagem de redução que vc quer!
Valeu pela ajuda cara!
Disponha!
na área de arigos, tutoriais tem uns exemplos de upload e redimensionamento, dê uma olhada.