Reescalar imagen js


([N3] GSI) #1

Hola a todos, estoy pelenado con js, para reescalar el tamaños de unas imagenes que tengo en un fichero de artículos, cargo la lista de registros los recorro en lectura escritura aplicando una rutina js, pero los cambios no se producen, se que estoy haciendo algo mal, pero mi desconocimiento de js y su uso me tiene perdido…




([N1] wikan) #2
  • Creo que los comandos de Script no inducen la ficha, tienes que crear un proceso con lenguaje javascript y aplicarlo en el recorrer lista

  • importClass("VRegister") sobra totalmente.

  • void setFieldImage() estás aplicando un método a nada y nadie, debería ser ficha.setFieldImage(edFoto)


([N3] GSI) #3

He realizado varias pruebas y sigue sin hacerlo, he realizado varios cambios, he creado un proceso js con origen y destino en ficha y el fichero de imágenes, adjunto pantallas nuevas…




([N1] wikan) #4

Perdón, es posible que te falte

ficha.modifyRegister() al final del todo

Si al añadir esto tampoco te funciona, abre una transación.


([N3] GSI) #5

He añadido esta linea y sigue sin guardar los cambios, no se a que te refieres con lo de la transacción, poner el comando “Forzar Transacción” después de ejecutar el proceso js??

Lo he puesto pero sigue sin guardar los cambios, te adjunto nueva captura de como ha quedado el proceso.js



([N1] wikan) #6

Aquí tienes un link para trabajar con las transacciones.

https://velneo.zendesk.com/entries/41187938-Programaci%C3%B3n-de-procesos-JavaScript-transaccionales

Tienes que estar identificado me parece.

Espera…es que tienes un lio de copy/paste, tienes que entender lo que estás haciendo.
edFoto.setImage(img.scaled(100,100,1,1));

  • img: está sin declarar en ningún sitio

Debería ser edFoto.scaled(100,100,1,1), edFoto es la variable es donde estás guardando la imagen.


([N3] pacosatu) #7

Hola GSI.

Como dice Manuel, has montado un pequeño lío de una operación realmente sencilla.

  • Primero, el comando “Recorrer lista lectura/escritura” abre una transacción, por lo tanto, los procesos que se llamen en este bucle ya tendrán la transacción abierta y no es necesario ni Forzar transacción, ni modifyRegister, … La transacción la gestiona totalmente el código Velneo, cerrándola cuando acaba el bucle “Recorrer lista lectura/escritura”.
  • Segundo, el proceso JavaScript llamado desde “Recorrer lista lectura/escritura” recibe como entrada en theRegisterIn la Ficha actual. De esta forma podemos acceder al campo Objeto Imagen y modificarlo gracias a la transacción activa.
  • Tercero, si quieres escalar una imagen sin deformarla, lo más práctico es que uses la función VImage.scaledToWidth(<ancho>,1) siendo <ancho> el Ancho de la imagen en pixeles. El Alto se calcula de acuerdo a la proporción de la Imagen. También puedes usar scaledToHeight() de la misma manera.

Con esto, el código queda:
Cargar lista(…)
—Recorrer lista lectura/escritura
------Ejecutar proceso (PRO_ESCALAR_FOTO …)

Código JavaScript

var oFoto = theRegisterIn.fieldToImage(“FOTO”)
if (oFoto) {
—var oImage = oFoto.scaledToWidth(<ancho>,1);
—theRegisterIn.setFieldImage(“FOTO”,oImage)
}

Con esto debe funcionar correctamente.

Saludos
Paco Satué


([N3] GSI) #8

Como siempre perfecto, gracias.


([N1] wikan) #9

@seh creo que aunque tengas transacción abierta, tienes que dar la orden de modifyRegister, si no, no aplica los cambios al registro.

Es como si abres un formulario (abre transacción), pero no aceptas.


([N3] GSI) #10

Yo lo he probado tal cual y me funciona.


([N1] wikan) #11

Entonces Paco tiene la razon, pero hay que matrizar que si la transacción la abres de manera manual con javascript si es obligado especificar si añades o modifcas el registro, addRegister o modifyRegister


([N3] pacosatu) #12

Hola Manuel.

Efectivamente, como ya he dicho en el apartado Primero, el comando de Velneo “Recorrer lista lectura/escritura” realiza las 3 tareas: abrir transacción, grabar las operaciones Alta,Baja,Modificacion y finalmente confirmar la transacción.

Si solo usamos JavaScript haremos: theRoot.beginTrans() para abrir transacción, addRegister/deleteRegister/modifyRegister para las operaciones Alta/Baja/Modificacion y finalmente confirmar la transacción con theRoot.commitTrans(). Si el proceso JavaScript termina sin un commitTrans() se producirá un AutoCommit() automático y la transacción terminará igualmente.

Un ejemplo de la Transacción completa en JavaScript:


importClass(“VProcess”)
// Ejecutamos un proceso Velneo para obtener la lista de registros
var oProceso = new VProcess(theRoot)
oProceso.setProcess(alias_app/PRO_OBTENER_LISTA")
if (oProceso.exec()) {
var oLista = oProceso.result()
// 1ª tarea - Abrimos Transacción (ver en vAdmin)
theRoot.beginTrans(“Reescalando fotos …”)
for (i = 0; i < oLista.size(); i++) {
var oRegistro = oLista.readAt(i)
var oFoto = oRegistro.fieldToImage(“FOTO”)
if (oFoto) {
var oImage = oFoto.scaledToWidth(50,1);
oRegistro.setFieldImage(“FOTO”,oImage)
// 2ª tarea - Operación de Modificación (ver columna Operaciones en vAdmin)
oRegistro.modifyRegister()
}
}
// 3ª tarea - Confirma Transacción (si quitamos esta línea se ejecutará un Autocommit())
// Ver en vAdmin la transacción completada
var lOK = theRoot.commitTrans()
}

Saludos
Paco Satué


([N4] Ramon Denuc) #13

Hola a todos,

Aprovechando la entrada he utiliza el proceso para redimensionar una imagen, pero como ya os he dicho en otras ocasiones, yo de JS muy poco.

Por esta razón os pido si es posible hacer una copia de la imagen que se va a redimensionar con JS, por si el usuario final decide deshacer el proceso de redimensionado, y dejar la imagen como estaba.

Es posible ?
Como ?


([N1] wikan) #14

Casi todo es posible, tendrías que guardar la imagen original en algún sitio.
Por ejemplo podrías, coger el objeto oFoto y antes de escalarlo, guardarlo en disco y si el usuario deshace poder leerlo y reasignarlo al campo.

A lo mejor, de una manera más fácil, usar el comando de Velneo Deshacer la transación te valdría, pero deshacer todo todo todo los cambios que hayas hecho.


([N3] pacosatu) #15

Hola Ramón.

El reescalado de imágenes de una tabla no es recomendable porque crecerá el contenedor CND de forma descontrolada.
El código JavaScript anterior tómalo únicamente como un ejemplo para aprender y nunca lo pongas en producción para tablas grandes.

En cualquier caso, si aun así quieres escalar una imagen concreta de un campo Objeto dibujo dispones de los comandos de Velneo “Exportar dibujo” e “Importar dibujo”. Con ellos puedes hacer una copia en disco de la imagen antes de ejecutar el código JavaScript y después recuperarla si es necesario.

Saludos
Paco Satué


([N4] Ramon Denuc) #16

Hola Paco,

Yo quiero poner esta opción para que el usuario pueda hacer más pequeñas las imagenes que inserta, creía que si a una imagen la haces proporcionalmente más pequeña, ocupara menos!!!

Ejemplo:

Si un usuario inserta una imagen digamos de 2048 x 1600, y el programa le da la opción de poder redimensionar la imagen, digamos a 1024*800 el tamaño también sera algo más pequeño, no ?


([N3] pacosatu) #17

Hola Ramon.

Cuando reescalas la imagen, ésta disminuye de tamaño por supuesto. Lo que crece es el contenedor CND de Velneo.
Por ejemplo, si la imagen original ocupa 2Mb y la reescalada se reduce a 1Mb, el contenedor CND ocupará 3Mb. Este es un problema con la gestión de los ficheros CND.

Por esta razón es conveniente que el Usuario reescale la imagen antes de guardarla definitivamente. Puedes usar para ello una tabla temporal en memoria.

Saludos
Paco Satué


([N4] Ramon Denuc) #18

Hola Paco, (Gracias).

Eso que acabas de contar no lo tenia en cuenta, más bien, pensaba que si inicialmente tienes una imagen de 2MB y la redimensionas a 1MB el espacio en el Contenedor CND disminuía. Todo lo que sea engrandecer el espacio nos indica que Velneo debería poner algún remedio, para mejorar en esta cuestión.

Saludos