olá!
tenho um campo do tipo IMAGEM (banco de Dados) e preciso redimensionar.
Já tentei no evento onValidate acessar a imagem que fica no TMP do scriptcase até o usuário clicar em atualizar, mas não consigo pois a imagem altera o nome original.
COMO FAÇO para antes do insert interceptar a imagem e fazer a alteração.
Faça um upload através de um campo em memória (virtual), após submeter o formulário, na onvalidatesucess, pegue a imagem (na pasta parametrizada na publicação) redimensione e salve-a manualmente no banco.
eu tentei mas apareceu a mensagem - Undefined variable: sKeepImage
Veja bem, vc deve estar usando algum código externo e não esta sabendo como usar.
// REDIMENSIONAR IMAGEM JÁ GRAVADA EM CAMPO BLOB
// Colocar nos Eventos OnAfter Insert e OnAfterUpdate:
/* Macro sc_lookup */
$_sql ="
SELECT
Foto
FROM
imagens
WHERE
ID = {ID}
";
sc_lookup(rs, $_sql);
if (isset({rs[0][0]})) {
$_MySQL_Blob=base64_decode({rs[0][0]}); // Decodificamos para código de imagem pura no PHP
$_size = 150; // Novo Tamanho da Imagem desejada
$_src = imagecreatefromstring($_MySQL_Blob);
$_width = imagesx($_src);
$_height = imagesy($_src);
$_aspect_ratio = $_height/$_width;
// Aqui tentamos manter a proporção da imagem original
if ($_width <= $_size) {
$_new_w = $_width;
$_new_h = $_height;
} else {
$_new_w = $_size;
$_new_h = abs($_new_w * $_aspect_ratio);
}
$_Imagem = imagecreatetruecolor($_new_w,$_new_h);
imagecopyresized($_Imagem,$_src,0,0,0,0,$_new_w,$_new_h,$_width,$_height);
// Criamos um buffer para o PHP não jogar a imagem nova na tela, ele vai esconder
ob_start ( );
imagejpeg($_Imagem);
imagedestroy($_Imagem); // Liberamos a memória
$_MySQL_Blob = base64_encode(ob_get_contents()); // Guardamos na variável a imagem que o PHP criou.
ob_end_clean ( );
// Finalizamos o Buffer
// Aqui verificamos a imagem gerada que vamos guardar na base de dados, se esta tudo certo.
echo "<img border=0 src='data:image/jpeg;base64,$_MySQL_Blob'>"; // Comentar esta linha depois...
// Gravamos a nova imagem redimensionada na tabela
sc_exec_sql("
UPDATE
imagens
SET
Foto = '$_MySQL_Blob'
WHERE
ID = {ID}
");
}
// REDIMENSIONAR IMAGEM JÁ GRAVADA EM CAMPO BLOB
// Colocar nos Eventos OnAfter Insert e OnAfterUpdate:
/* Macro sc_lookup */
$_sql ="
SELECT
Foto
FROM
imagens
WHERE
ID = {ID}
";
sc_lookup(rs, $_sql);
if (isset({rs[0][0]})) {
$_MySQL_Blob=base64_decode($_MySQL_Blob); // Decodificamos para código de imagem pura no PHP
$_size = 150; // Novo Tamanho da Imagem desejada
$_src = imagecreatefromstring($_MySQL_Blob);
$_width = imagesx($_src);
$_height = imagesy($_src);
$_aspect_ratio = $_height/$_width;
// Aqui tentamos manter a proporção da imagem original
if ($_width <= $_size) {
$_new_w = $_width;
$_new_h = $_height;
} else {
$_new_w = $_size;
$_new_h = abs($_new_w * $_aspect_ratio);
}
$_Imagem = imagecreatetruecolor($_new_w,$_new_h);
imagecopyresized($_Imagem,$_src,0,0,0,0,$_new_w,$_new_h,$_width,$_height);
// Criamos um buffer para o PHP não jogar a imagem nova na tela, ele vai esconder
ob_start ( );
imagejpeg($_Imagem);
imagedestroy($_Imagem); // Liberamos a memória
$_MySQL_Blob = base64_encode(ob_get_contents()); // Guardamos na variável a imagem que o PHP criou.
ob_end_clean ( );
// Finalizamos o Buffer
// Aqui verificamos a imagem gerada que vamos guardar na base de dados, se esta tudo certo.
echo "<img border=0 src='data:image/jpeg;base64,$_MySQL_Blob'>"; // Comentar esta linha depois...
// Gravamos a nova imagem redimensionada na tabela
sc_exec_sql("
UPDATE
imagens
SET
Foto = '$_MySQL_Blob'
WHERE
ID = {ID}
");
}
Tem essas dicas interessantes também:
UPLOAD LIMITAR TAMANHO DO ARQUIVO ENVIADO:
Limitar tamanho arquivo UPLOAD (Pré Validação)
AUTOMATICO PELO SC:
O campo já existe no formulário, em “Aplicação > Configuração”
Há o item “Tamanho máximo do arquivo”.
MANUALMENTE PELO PHP (No evento > onApplicationInit)
// Checar:
echo ini_get(‘upload_max_filesize’).’
’;
// Configurar
ini_set( ‘upload_max_size’ , ‘2M’);
ini_set( ‘post_max_size’, ‘2M’);
ini_set( ‘max_execution_time’, ‘300’);
E como vc esta incluindo a biblioteca no Scriptcase?
lá pela biblioteca externa.
o esquisito é que ela faz a função de manipular a imagem, salvando a imagem redimensionada, mas apresenta essa mensagem
Undefined variable: sKeepImage
include(sc_url_library(‘prj’, ‘layout’, include/wideImage/wideImage.php"’ ));
e o código com essa biblioteca é super simples
$imagem = {minhafoto};
$resized = $image->resize(400, 300);
$img_final = $resized->asString(‘jpg’, 80);
{minhafoto} = $img_final ;
por que um simples
{foto_alun} = “…/_lib/img/grp__NM__bg__NM__FOTOALUNO1.png”; no onvalidate
dá uma mensagem de erro?
Cite o erro.
Que tipo de campo é {foto_alun}?
o campo {foto_alun} e do tipo imagem (banco de dados), eu usei esta forma para testar a adição de uma imagem via código, mas a mensagem de erro continua
vc não pode adicionar uma constante a um campo do tipo imagem.
quer exibir a imagem?
transforme o campo em label e atribua:
apesar que pelo nome da imagem que demonstra aqui essa não deve se encontrar nessa pasta _lib/img a não ser que vc tenha copiado manualmente esse arquivo para a referida pasta
Haroldo e Jailton, vc´s tem algum exemplo prático de tratamento de imagem antes de inserir no banco, já vi que por esse caminho eu não vou conseguir.
jailton nessa linha
$_MySQL_Blob=base64_decode($_MySQL_Blob);
qual a origem do $_MySQL_Blob se ele nunca foi referenciado?
if (isset({rs[0][0]})) {
$_MySQL_Blob=base64_decode({rs[0][0]});
É que eu tinha colocado já um código base64 nos meus testes, ai tentei colocar ele aqui no POST, e não deu espaço, ai eu removi e esqueci, de acertar esse detalhe.
Jailton. infelizmente não deu.
imagecreatefromstring(): Empty string or invalid image
imagesx() expects parameter 1 to be resource, boolean given
imagesy() expects parameter 1 to be resource, boolean given
Division by zero
imagecreatetruecolor(): Invalid image dimensions
imagecopyresized() expects parameter 1 to be resource, boolean given
imagejpeg() expects parameter 1 to be resource, boolean given
imagedestroy() expects parameter 1 to be resource, boolean given
Eu modifiquei o código retirando o base64_decode da linha
$_MySQL_Blob=base64_decode({rs[0][0]});
ele passa tudo mas não salva corretamente provavelmente salva um codigo corrompido.
muito obrigado pela atenção e se vc puder identificar o problema fico grato
Tenta exibir a imagem que tá gravada neste campo com isso, para ver se ela esta ok, pode ter corrompido a imagem nos outros testes.
/* Macro sc_lookup */
$_sql ="
SELECT
Foto
FROM
imagens
WHERE
ID = {ID}
";
sc_lookup(rs, $_sql);
if (isset({rs[0][0]})) {
$_MySQL_Blob={rs[0][0]};
echo "<img border=0 src='data:image/jpeg;base64,$_MySQL_Blob'>"; // Comentar esta linha depois...
}
Jailton,
Ele deseja upar uma imagem, diminuir seu tamanho e salvar no banco.
E não esta sabendo usar a classe externa ao sc para realização essa operação.
Foi o que entendi.
Haroldo tá certo, eu não entendo como o SC dá mensagem de erro sendo que a função redimensionou e salvou corretamente,
mas se com a biblioteca eu não consigo, qual seria a forma de execução adotada por vocês?
é a biblioteca mesmo que eu utilizo. Coloco ela com o biblioteca externa no sc