PDA

Ver la Versión Completa : Gráficos en una base de datos


mlara
24-07-2003, 05:53:14
Hola.

Estoy seguro de que alguien pude ayudarme. Estoy tratando de insertar un gráfico en una tabla paradox. En realidad (?) parece que lo he hecho, pero cuando intento leerlo tengo dificultades, y lo que obtengo es un archivo que tiene el mismo tamaño de la gráfica, pero que no se deja ver como una imagen.

Cuál es la mejor manera de insertar un gráfico en una tabla paradox en un campo tipo GRAPHIC desde Delphi, y luego, cuál es la mejor manera de recuperar ese gráfico también desde Delphi?

Luego de hacerlo en paradox tendré que hacerlo en Interbase. Tendré problemas o se trabaja de la misma manera?

Muchas gracias por su colaboración.

SnaKe
24-07-2003, 12:02:07
Hola,

Yo manejo gráficos almacenados en la base de datos en formato JPG tanto en bases de datos Paradox como Interbase sin problemas, te cuento como lo hago:

El campo en que almacenes las imagenes ha de ser de tipo:

BD Paradox: Graphic
BD Interbase: BLOB

Para insertar en el campo la foto lo que hago es esto, en un botón que tengo de incorporar foto el codigo es este:


if (OpenDialog1.Execute) then begin
if (Tabla.State <> dsBrowse) then
Tabla.Edit;
TablaFOTO.LoadFromFile (OD.FileName);
Tabla.Post;
end;

OpenDialog1 es un control TOpenDialog.
Tabla es un TTable o TIBTable o lo que quieras asociado a la tabla de la BD.
TablaFOTO es el campo persistente en el que se almacena la foto.

Con eso ya cargas la foto en la BD, para mostrarla lo que hago es usar un control no enlazado a datos, en mi caso un TImage al que le pongo la propiedad Stretch a True y no es Autosize. Bien, como son imagenes JPEG incluyo entre los uses la unit JPEG.

En el evento OnScroll (creo que era este) del DataSet asociado a la tabla pongo este código:


var
B : TJPEGImage;
MS : TMemoryStream;
begin
B := TJPEGImage.Create;
MS := TMemoryStream.Create;
TablaFOTO.SaveToStream (MS);
B.LoadFromStream (MS);
Image1.Picture.Assign (B);
MS.Free;
B.Free;
end;


Puede que falten algunos controles o meter todo en try...except... pero bueno básicamente el funcionamiento es así.

Espero que te sirva.

Un saludo.

mlara
25-07-2003, 02:19:22
Bueno, eso está bien.

Ahora, que pasa si yo quisiera insertar una imagen en una tabla con un TQuery?


with Query do begin
SQL.Clear;
SQL.Add('INSERT INTO Tabla (Foto) VALUES(');
SQL.Add(); // <- Aquí va la imagen
SQL.Add(')');
ExecSQL;


En el código anterior como puedo insertar la imagen? Qué debe ir en la segunda línea si el campo foto es de tipo gráfico o de tipo binario?

Muchas gracias.

SnaKe
25-07-2003, 10:39:01
Hola,

Todo tiene remedio... jejeje :D hacerlo con un TQuery en SQL... vamos allá... casi que esto entraría en el foro de SQL pero bueno... como quieres insertar una foto...

Voy a cambiar un pelín tu código...


var
MS : TMemoryStream;
begin
MS := TMemoryStream.Create;
MS.LoadFromFile(edFichero.Text //Nombre de la foto...);
with Query do begin
SQL.Clear;
SQL.Add('INSERT INTO Tabla (Foto) VALUES(:PFOTO)');
SQL.ParamByName('PFOTO').LoadFromStream(MS,ftGraphic);
// o bien (prueba ambas, creo que no hay diferencia pero por si acaso)
// SQL.ParamByName('PFOTO').LoadFromStream(MS,ftBlob);
ExecSQL;
MS.Free;
end; // del with
end; // del procedure


Espero que te valga...

Salu2.

mlara
05-08-2003, 02:32:37
Gracias por tus respuestas, me han servido mucho. Sin embargo sigo teniendo problemas para visualizar una imagen guardada en una tabla. Este es el código que estoy usando:


with DM.Q1 do begin
SQL.Clear;
SQL.Add('SELECT * FROM EstAdditional1 WHERE Estudiante = '+QEstudiantes.FieldByName('CodigoInt').AsString);
Open;
if RecordCount = 1 then begin
(FieldByName('Fotografia') as TGraphicField).SaveToStream(MemoryStream);
ImageBuffer.LoadFromStream(MemoryStream);
with fEstudiantesRegistroFotografia do begin
iFotografia.Picture.Assign(ImageBuffer);
iFotografia.Visible := True;
end;
end;
Close;
end;
MemoryStream.Free;
ImageBuffer.Free;


, donde:

DM es un módulo de datos
Q1 es un TQuery
QEstudiantes es un TQuery
MemoryStream es un TMemoryStream
ImageBuffer es un TJPEGImage
fEstudiantesRegistroFotografia es un TForm
iFotografia es un TImage

En este código no se genera ningún error. El error se genera cuando se ejecuta el ShowModal de la forma que contiene la imágen, es decir cuando se ejecuta:

fEstudiantesRegistroFotografia.ShowModal;

El mensaje de error dice:

JPEG error #42.

En realidad no sé que significa, y aunque he hecho algunas modificaciones no he dado con el problema. Incluso he probado con varias imágenes.

Por si acaso, estoy guardando la imagen así:


// Fotografía
if fEstudiantesRegistroFotografia.iFotografia.Visible then begin
MemoryStream := TMemoryStream.Create;
fEstudiantesRegistroFotografia.iFotografia.Picture.Graphic.SaveToStream(MemoryStream);
Clear;
Add('DELETE FROM EstAdditional1 WHERE Estudiante = '+fEstudiantesConsulta.QEstudiantes.FieldByName('CodigoInt').AsString);
DM.Q1.ExecSQL;
Clear;
Add('INSERT INTO EstAdditional1 (Estudiante, Fotografia) VALUES ('+fEstudiantesConsulta.QEstudiantes.FieldByName('CodigoInt').AsString+', :Foto)');
DM.Q1.ParamByName('Foto').LoadFromStream(MemoryStream, ftGraphic);
DM.Q1.ExecSQL;
MemoryStream.Free;
end;


De nuevo muchas gracias por su ayuda.

SnaKe
11-08-2003, 09:13:03
Hola,

Creo recordar que el JPEG Error #42 es que el JPEG no es correcto y por lo que veo en tu código, el error no está en la visualización sino en la inserción de la imagen en la base de datos.

Por lo que veo pones el contenido de un control TImage sobre un memorystream y luego le pasas a la query de inserción como parámetro ese memorystream. Tienes que tener en cuenta que un TImage aunque le hayas asignado un TJPEGImage internamente trabaja con Bitmaps, es decir tu imagen se está almacenando correctamente en la BD pero en formato BMP en lugar de JPEG y luego al querer asignarla sobre el TJPEGImage en la visualización genera dicho error.

Para la inserción deberías llenar el memorystream con un loadfromfile en lugar de a partir del TImage, en el momento en el que cargas sobre el TImage la imagen JPEG llena el memorystream o guarda la ruta del fichero JPEG cargado en una variable de la cual luego puedas llenar el memorystream.

Resumiendo y repitiendome, en lugar de llenar el memorystream a partir del control TImage hazlo con un loadfromfile de la imagen JPEG directamente.

Salu2.

pgraciap
06-09-2003, 04:23:02
Hola, ya probaron esta utileria?

http://www.marteens.com/imDBJPEG.zip

Este package contiene el código fuente del componente imDBImage, que permite trabajar con imágenes almacenadas campos BLOB en el formato JPEG. Acepta también imágenes de mapas de bits. Soporta el uso del Portapapeles, comprimiendo la imagen pegada antes de guardarla en la tabla.

Creo que ayudaria mucho y ya no se generaria codigo.....

Saludos....:)

Flycket
13-11-2003, 18:07:45
hola foro!!!!:)

yo he probado esa utlidad (imDBjpeg) aunque sin resultados favorables, ya que me sigue dando el mismo error.
Si ha alguien le funciona oya yave como hacerlo prodrian mandarme el codigo... xq tengo la cabeza mareada de darle vueltas.


Muxas gracias y un saludo...:confused:

flycket@hotmail.com

pgraciap
14-11-2003, 18:44:29
Flycket

Podrias dar mas datos de que es el error que tienes?

mira para introcucir una imagen utilizo lo siguiente:
imDBImage1.Picture.LoadFromFile('Archivo');
o
Para introcucirlo desde el clipborat:
imDBImage1.PasteFromClipboard;
Claro que esto es dentro de los comandos de:
table.Apend;
...
imDBImage1.Picture.LoadFromFile('Archivo'); o imDBImage1.PasteFromClipboard;
...
Table.Post;
y hasta ahorita no me ha fallado... :d

Flycket
17-11-2003, 13:16:55
A la hora de escribir en la base de datos, es cuando sale el error, yo creo que tiene que ver con interbase, aunque no estoy seguro.


El mensaje pone

Project proyecto1.exe raise exception class EInvalidGraphic wiht message'Bitmap image is not valid'. Process stopped. Use Step or Run to Continue.

No me da este error si lo que introduzco es un bmp
:confused: :confused: :confused: :confused:

Flycket
17-11-2003, 20:51:05
pgraciap podrias mandarme un demo...


Esq tengo la cabeza rebentada d ebuscar soluciones y lo jodido esq sin llegar a ningun sitio...

bueno te lo agradeceria.

saludos
:D
... y gracias

mlara
17-11-2003, 21:20:56
Hola. No he usado el paquete que estás usando, pero yo solucioné mi problema cargando directamente la imagen jpg del archivo respectivo, de la siguiente manera:


// Fotografía
...
DM.Q1.ParamByName('Foto').LoadFromFile('...\filename.jpg', ftBlob);


En el código anterior el error estaba aquí:


// Fotografía
...
DM.Q1.ParamByName('Foto').LoadFromStream(MemoryStream, ftGraphic);


Sucede que se usa LoadFromStream, pero como parámetro se le pasa un MemoryStream, entonces no funciona, no me pregunten por qué (je je).

Flycket
18-11-2003, 00:12:51
Hola buenas noxes, he estado probando lo que me digiste pero nada sigo teniendo problemas..


No puedes mandarme un demo para ver como lo haces esque tengo la cabeza exa polvo...de buscar y buscar una posible solucion.

t edejo mi direccion flycket@hotmail.com



un saludo :p

guillotmarc
18-11-2003, 00:50:04
Hola.

El error no tiene nada que ver con Interbase, puesto que Interbase no hace ninguna verificación de que lo que le introduzcas sea un gráfico, se limita a almacenarlo.

El problema está en que tienes un control TDbImage conectado al campo, una vez asignado un valor (el gráfico) al campo, el TDbImage intenta mostrarlo, pero como este control no puede mostrar archivos Jpeg, salta el error.

La solución pasa por utilizar un TImage que no esté conectado a la base de datos. Y asignar código para que cada vez que muestres un registro, cargue la imagen al TImage.

Tienes el código para cargar la imagen en el TImage, en el primer mensaje de respuesta de este hilo.

NOTA : No olvides poner la unidad Jpeg en el Uses de tu módulo.

Saludos.

Flycket
18-11-2003, 01:17:09
he probado lo dices...pero


Image1.Picture.Assign (B); en esta linea me da error

Acceso de violacion a una direccion en el modulo.


no se por que sera... jo..

Estoy de probar codigo...

guillotmarc
20-11-2003, 04:12:55
Hola.

Este es el código que utilizo yo, a ver si te sirve :


procedure TForm1.CargarImagen;
var Jpeg:TJpegImage;
Corriente:TMemoryStream;
begin
imgFoto.Picture := nil;
if cdsTablaIMAGEN.BlobSize > 0 then begin
Jpeg:=TJpegImage.create;
Corriente:=TMemoryStream.create;
try
cdsDatosTabla.SaveToStream(Corriente);
Corriente.Seek(0,soFromBeginning);
Jpeg.LoadFromStream(Corriente);
imgFoto.Picture.Assign(Jpeg);
finally
Jpeg.Free;
Corriente.Free;
end;
end;
end;


Como puedes ver hay un posicionamiento al inicio del Stream (mediante un Seek)

Pruébalo a ver.

Saludos.

allende
27-11-2003, 23:08:49
Hola amigos, tengo un problema muy similar al planteado inicialmente en este hilo.
Tengo una BD en interbase 6, pero no la hice yo, es una BD que tengo que reutilizar y no tengo acceso a quien la hizo.
Sucede que tiene una tabla con una campo BLOB que tiene imagenes.
Ya probe mostrarlas con codigos similares a los que se sugieren aqui y siempre me reporta error jpeg #52 en la linea que le carga el stream al jpeg(jpeg.loadfromstream(MyStream)), no se que significa este error.
Me da la impresion de que la imagen no esta en JPG, pero al parecer tampoco esta en BMP pues los DBImages me reportan que no esta en ese formato.
Alguien tiene idea de otras pruebas para saber en que formato puede estar la imagen y como puedo mostrarla?

mil gracias

Radesky
04-05-2008, 00:35:46
[quote=SnaKe;9827]Hola,

Yo manejo gráficos almacenados en la base de datos en formato JPG tanto en bases de datos Paradox como Interbase sin problemas, te cuento como lo hago:

El campo en que almacenes las imagenes ha de ser de tipo:

BD Paradox: Graphic
BD Interbase: BLOB

Para insertar en el campo la foto lo que hago es esto, en un botón que tengo de incorporar foto el codigo es este:


if (OpenDialog1.Execute) then begin
if (Tabla.State <> dsBrowse) then
Tabla.Edit;
TablaFOTO.LoadFromFile (OD.FileName);
Tabla.Post;
end;


Hola.
Yo quisiera preguntar algo sobre esta respuesta:
el opendialog tiene que ir en un menú verdad?
y asi se puede buscar la ruta del archivo?????

si pongo el archivo con extensión bmp ya la muestra y sirve todo muy bien, pero esa es la duda que tengo, me podrían ayudar????:confused:

Gracias...
salu2

bladek1016
09-05-2008, 07:15:22
if (OpenDialog1.Execute) then begin
if (Tabla.State <> dsBrowse) then
Tabla.Edit;
TablaFOTO.LoadFromFile (OD.FileName);
Tabla.Post;
end;


No entiendo muy bien a que te refieres con el Tablafoto, es un DBimage? previamente mencionas que corresponde al campo, pero en mi caso el campo donde deberian estar almacenadas las fotos se llama Foto y evidentemente un Foto.LoadFromFile no existe, podrias ser mas especifico, no se como agregar la foto a la BD uso Paradox y Delphi 7

Agradezco tu respuesta

mlara
09-05-2008, 08:58:55
Se están como enrredando me parece. La única inconsistencia que veo es que OD es el mismo OpenDialog1. De esta manera el código quedaría así:

if (OpenDialog1.Execute) then begin
if (Tabla.State <> dsBrowse) then
Tabla.Edit;
TablaFOTO.LoadFromFile(OpenDialog1.FileName);
Tabla.Post;
end;

shulygart
04-05-2011, 19:09:55
Se están como enrredando me parece. La única inconsistencia que veo es que OD es el mismo OpenDialog1. De esta manera el código quedaría así:

if (OpenDialog1.Execute) then begin
if (Tabla.State <> dsBrowse) then
Tabla.Edit;
TablaFOTO.LoadFromFile(OpenDialog1.FileName);
Tabla.Post;
end;



MIL DISCULPAS ESTOY BUECANDO SOLUCIONAR ALGO PARECIDO

SOY NUEVO EN ESTO

CON UN DIRECTORYLISTBOX Y UN FILELISTBOX BUSCO LA DIRECCION Y CODIFIQUE QUE AL DOBLE CLIC SOBRE LA IMAGEN SE CARGUE EN UNA TIMAGE, YA LA TENGO EN TIMAGE1, YA TENGO MI BASE EN PARADOX UN CAMPO GRAPHIC
LA PREGUNTA ES QUIERO GUARDAR EL REGISTRO COMPLETO DE UN EMPLEADO INCLUYENDO SU FOTO, PERO AL PASAR DE TIMAGE1 AL DBIMAGE1 SOLO PUEDO PASAR BMP LOS JPEG SIMPLEMENTE NO LOS GUARDA

CON ESTO ASIGNO LA IMAGEN AL DBIMAGE
TABLE1.APPEND;
DBImage1.Picture:=image1.Picture;
TABLE1.POST;
Y EL RESTO DE CODIGO DONDE GUARDO TODOS LOS DEMAS DATOS DEL EMPLEADO.

OJALA PUEDAN AYUDARME ME URGE.+

MUCHAS GRACIAS POR LOS APORTES SON MUY EXCELENTES.
GRACIAS POR EL TIEMPO.

Casimiro Notevi
04-05-2011, 20:07:09
Bienvenido a clubdelphi, por favor, lee nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php), muchas gracias por tu colaboración.
Aunque ya veo que en el año 2005 también eras nuevo en esto y se te dirigió a la guía de estilo, puede que la hayas olvidado, mejor que le des un repaso ;)

Muchas Gracias por la guia esta muy bien, procurare seguir las instrucciones, ahora buscare el foro correspondiente para exponer mi tema.
bueno en realidad solo necesito saber el codigo o como le hago para poder respaldar mi BD en delphi5 a un disket o cualquier carpeta de mi ordenador.

Enlace. (http://www.clubdelphi.com/foros/showthread.php?t=26892)

shulygart
04-05-2011, 21:48:36
mil disculpas si desde el 2006 aproximadamente, deje de manejar delphi aunque confieso no haberlo manejado al 100% en ese entonces ahora lo estoy retomando y me surgio esa dua, espero me puedan apoyar ya que si es de mucha utilidad en estos momentos.

saludos y disculpas

Casimiro Notevi
04-05-2011, 22:15:25
Estupendo, amigo, ya sabes que aquí son bienvenidas todas las personas.
Te he dirigido a la guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php) para que recordarte una serie de pequeñas normas que seguimos todos, para que esto no sea un caos y descontrol.
Te aconsejo que abras un nuevo hilo en el foro adecuado, que pongas un título descriptivo, que no grites (no escribas todo en mayúsculas), que expliques lo más amplia y claramente posible tu problema o duda, etc. para que se te pueda ayudar lo más rápido y mejor posible.
Todo lo que te he explicado viene redactado en la guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php) de clubdelphi, se lee en menos de dos minutos.
Muchísimas gracias por tu colaboración.
Y s tienes alguna duda sobre el manejo de los foros, sólo has de preguntar a cualquier moderador. Pinchas en su nombre y verás un menú con varias opciones, seleccionas: "Enviar mensaje privado" y haces tu consulta.
Saludos.

martinlillo
19-09-2011, 17:42:08
Hola, ya probaron esta utileria?

http://www.marteens.com/imDBJPEG.zip

Este package contiene el código fuente del componente imDBImage, que permite trabajar con imágenes almacenadas campos BLOB en el formato JPEG. Acepta también imágenes de mapas de bits. Soporta el uso del Portapapeles, comprimiendo la imagen pegada antes de guardarla en la tabla.

Creo que ayudaria mucho y ya no se generaria codigo.....

Saludos....:)

Instalé esa utilería, cambié un DBImage por un imDBImage, seteé el dataset y el field del componente, y me tira un error cuando corro el programa (Access violation).

Hay que setear algo más?

Saludos y gracias!

Casimiro Notevi
19-09-2011, 17:47:12
¿Has puesto el jpeg en el uses?

martinlillo
19-09-2011, 18:08:33
Sí, está puesto.

Gracias!

Edi was here
27-03-2012, 00:01:43
Todo bien solo que con el codigo que mencionas podras usar .bmp y no .jpg,