Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   cual es la mejor forma de trabajar con blob (https://www.clubdelphi.com/foros/showthread.php?t=80214)

anubis 10-09-2012 00:04:37

cual es la mejor forma de trabajar con blob
 
Hola amigos,

Ya estoy leyendo y guardando imagenes jpg en archivos blob de un bd, pero estoy limitado a los jpg.
Cargo el archivo jpg en un stream y al reves e incluso los imprimo con fortesreport.
La única pega que tiene es que cuando la imagen ocupa toda una hoja, en el fortesreport preview, se dificulta hacer zoom o subir y bajar el scroll.
Las imagenes ocupan sobre 300kb.
No se podria hacer lo mismo con imagenes png o bien con pdf (que seria lo idoneo)?

Ya estuve buscando lo mismo que use para el jpg pero en png pero no lo encuentro.

como lo trabajais vosotros?

saludos y gracias

Casimiro Notevi 10-09-2012 00:11:36

En un campo blob puedes guardar lo que quieras, ¿qué problema tienes?

anubis 10-09-2012 00:15:40

Si, gracias. Mas que nada el poder abrir un pdf en lazarus y luego pasarlo a un blob tal y como lo hago con jpg.

O bien un un png,

el problema es trabajar con formatos, verlos en pantalla por ejemplo y luego guardarloCon jpg no tengo problema, se me dificultan los otros formatos. Lease png o pdf.

Cita:

JPG:=TJPEGImage.Create;
if not OpenPictureDialog1.Execute then Exit;
jpg.LoadFromFile(OpenPictureDialog1.FileName);
Image1.Picture.Assign(JPG);
Stream := form1.ZQuery1.CreateBlobStream(form1.zquery1.FieldByName('factur'), bmWrite); // Asignamos el BLOB a un stream
jpg.SaveToStream(Stream); // y guardamos la imagen como JPEG (convertido), en el stream
Stream.Destroy;// liberamos
Esto es lo que uso.

saludos y gracias

Casimiro Notevi 10-09-2012 01:04:23

Lo que quieres es verlo "dentro" de tu programa o abrirlo con el programa predeterminado del sistema, ejemplo, si es un html que se abra el firefox, si es un gif que se abra el visor de imágenes, etc.
¿Eso es lo que quieres?

anubis 10-09-2012 01:07:23

con el jpg lo veo dentro de un timage,
un pdf o un png como lo puedo guardar en un blob desde dentro de mi programa?.

Casimiro Notevi 10-09-2012 02:02:18

¿Guardarlo?, tienes varias formas, pero simplificando mucho:
Código Delphi [-]
dataset.campoblob.loadfromfile('elficheroquesea.pdf');
Haz una búsqueda por clubdelphi, encontrarás código para hacerlo, es un tema muy repetido.

Es más, creo recordar que tú mismo preguntaste esto hace unos meses. Me parece que con sqlite.

anubis 10-09-2012 02:38:39

si, es cierto, pregunte, pero me faltaban esos detalles.

buscare en el foro, pero lo que me interesaba no es guardar sino poder abrir en mi aplicacion eso que se guarda, de ahi que use los jpg.

gracias

ecfisa 10-09-2012 03:19:29

Hola anubis.

No utilizo Lazarus pero ví que en varios sitios citaban a la librería [MuPDF], tal vez te sirva para lo que estas buscando.
Podes descargarlo de [aquí] (GNU Public License).

Saludos.

anubis 10-09-2012 03:52:49

Casimiro,
Ya resolvi una parte, la cuestion era que me empeñaba en usar el tjpegimage, cuando podia hacerlo como:

Código Delphi [-]
Image1.Picture.LoadFromStream(stream);
Asi me sirve para cualquier imagen soportada por timage.

lo unico que como png me ocupa 10 veces mas la imagen que con el jpg.

Como no voy a manipular imiagenes solo guardarlas en un blob y verlas.

Ahora me falta buscarle la forma con el pdf.

ecfisa, ya vi el componente pero no me sirve.

Lo que nose es si existe alguna forma de cargar el pdf de forma externa y pasarle el dato al stream para guardarlo?

Casimiro Notevi 10-09-2012 10:07:44

Cita:

Empezado por anubis (Mensaje 442568)
Lo que nose es si existe alguna forma de cargar el pdf de forma externa y pasarle el dato al stream para guardarlo?

Normalmente lo que yo hago es extraer del blob y guardar el fichero en un directorio temporal, luego ejecuto una llamada para abrirlo y es el propio windows el que se encarga de abrirlo con el programa predeterminado que tenga según del tipo de fichero que sea.
O sea, que lo abro "externamente" a mi programa.

anubis 11-09-2012 19:01:46

Gracias casimiro,

Ya estuve viendo el winexec, pero hace referencia a un archivo, lo que no entiendo como puedo, por ejemplo, es hacer una llamada para cargar una imagen en pdf (que lo abre con el acrobat p.e.) y de ahi pasarlo a un stream para guardarlo en un blob.
Porque me imagino que el proceso inverso, leer de un blob y pasarlo para visualizarlo con el acrobat.

Componentes para lazarus de pdf no he visto salvo powerpdf, pero solo para crear y en mi caso no he logrado que funcione bien.:(

gracias de nuevo.

Casimiro Notevi 11-09-2012 19:25:38

Tú sólo has de decirle al sistema que lo abra, él sabrá con qué abrirlo.
Normalmente con ShellExecute, si mal no recuerdo.
Haz una búsqueda por esa palabra en los foros, encontrarás código de ejemplo.

mightydragonlor 11-09-2012 20:17:48

TProcess para que sea multiplataforma con Lazarus.

Casimiro Notevi 11-09-2012 20:38:40

Cita:

Empezado por mightydragonlor (Mensaje 442807)
TProcess para que sea multiplataforma con Lazarus.

¿La función como se llama así?

mightydragonlor 11-09-2012 21:23:31

no, TProcess es una clase que permite ejecutar cualquier programa externo.
http://www.freepascal.org/docs-html/.../tprocess.html

roman 11-09-2012 21:33:28

Pero ShellExecute sirve también para abrir el programa asociado al archivo que se le pasa. ¿TProcess también?

// Saludos

mightydragonlor 11-09-2012 21:45:57

El ShellExecute sólo sirve para Windows, TProcess funciona con Win2, Linux y MacOS, pero depende mas de lo que quieras abrir y el como lo quieres abrir, es decir, puedes ejecutar excel y pasarle como parámetro la ruta del archivo con TProcess y funciona, ahora, si no sabes que ruta o que programa abre que, se puede usar la función OpenDocument, sólo debes poner en uses LCLIntf y LCLProc, y abrirá el documento con el programa asignado en el S.O.

roman 11-09-2012 21:51:11

Cita:

Empezado por mightydragonlor
si no sabes que ruta o que programa abre que, se puede usar la función OpenDocument

Pues sí, es que esta funcionalidad es la que planteaba Casimiro desde un principio.

// Saludos

rretamar 11-09-2012 23:28:09

Si son archivos muy grandes (y muchos) cuidadín con guardarlos en la base de datos. No sólo por el tamaño que alcanzará el archivo, sino porque si se daña la base de datos existe la posibilidad de que no se pueda recuperar la información. Cuesta un poco más (algunas líneas de código adicionales) pero en lo particular a los archivos de ese tipo (imágenes, video, audio) prefiero almacenarlos fuera de la base de datos, y colocando un campo donde almaceno la ubicación del archivo externo.

A lo mejor es que soy medio paranoico con la "pérdida de datos".

Como decía un profesor:

-"¿ Podés usar una consulta SQL que te de como resultado las morochas o las rubias en el campo de imágenes de la base de datos ?". -"!!! No !!!"...-"¿ Entonces para qué almacenas imágenes en una base de datos ?". :D

Casimiro Notevi 12-09-2012 00:52:15

Cita:

Empezado por rretamar (Mensaje 442849)
Como decía un profesor:
-"¿ Podés usar una consulta SQL que te de como resultado las morochas o las rubias en el campo de imágenes de la base de datos ?". -"!!! No !!!"...-"¿ Entonces para qué almacenas imágenes en una base de datos ?". :D

Pues si no guardas las imágenes... tampoco puedes saberlo ;)

No sé qué BD está usando, pero en los últimos 2012-1998=14 años nunca he tenido ningún problema de ese tipo con firebird y con BDs de muchos gigas.


La franja horaria es GMT +2. Ahora son las 20:53:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi