![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Gráficos en una base de datos
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.
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre. |
#2
|
||||
|
||||
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: Código:
if (OpenDialog1.Execute) then begin if (Tabla.State <> dsBrowse) then Tabla.Edit; TablaFOTO.LoadFromFile (OD.FileName); Tabla.Post; end; 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: 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; Espero que te sirva. Un saludo.
__________________
Todos somos aficionados. La vida es tan corta que no da para más. Guia de Estilos |
#3
|
||||
|
||||
Bueno, eso está bien.
Ahora, que pasa si yo quisiera insertar una imagen en una tabla con un TQuery? Código:
with Query do begin
SQL.Clear;
SQL.Add('INSERT INTO Tabla (Foto) VALUES(');
SQL.Add(); // <- Aquí va la imagen
SQL.Add(')');
ExecSQL;
Muchas gracias.
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre. |
#4
|
||||
|
||||
Hola,
Todo tiene remedio... jejeje ![]() Voy a cambiar un pelín tu código... 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 Salu2.
__________________
Todos somos aficionados. La vida es tan corta que no da para más. Guia de Estilos |
#5
|
||||
|
||||
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:
Código:
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; 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í: Código:
// 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;
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre. |
#6
|
||||
|
||||
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.
__________________
Todos somos aficionados. La vida es tan corta que no da para más. Guia de Estilos |
#7
|
|||
|
|||
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.... ![]()
__________________
Have a nice day :) |
#8
|
|||
|
|||
![]() 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... ![]() flycket@hotmail.com |
#9
|
|||
|
|||
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
__________________
Have a nice day :) |
#10
|
|||
|
|||
![]() 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 ![]() ![]() ![]() ![]() |
#11
|
|||
|
|||
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 ![]() ... y gracias |
#12
|
||||
|
||||
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:
Código:
// Fotografía ... DM.Q1.ParamByName('Foto').LoadFromFile('...\filename.jpg', ftBlob); Código:
// Fotografía ... DM.Q1.ParamByName('Foto').LoadFromStream(MemoryStream, ftGraphic);
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre. |
#13
|
|||
|
|||
![]() 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 ![]() |
#14
|
||||
|
||||
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#15
|
|||
|
|||
![]() 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... |
#16
|
||||
|
||||
Hola.
Este es el código que utilizo yo, a ver si te sirve : Código:
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; Pruébalo a ver. Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#17
|
|||
|
|||
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 |
#18
|
||||
|
||||
[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: Código:
if (OpenDialog1.Execute) then begin if (Tabla.State <> dsBrowse) then Tabla.Edit; TablaFOTO.LoadFromFile (OD.FileName); Tabla.Post; end; 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???? ![]() Gracias... salu2 Última edición por Radesky fecha: 03-05-2008 a las 23:57:23. Razón: duda un poco aclarada |
#19
|
|||
|
|||
![]() Código:
if (OpenDialog1.Execute) then begin if (Tabla.State <> dsBrowse) then Tabla.Edit; TablaFOTO.LoadFromFile (OD.FileName); Tabla.Post; end; Agradezco tu respuesta |
#20
|
||||
|
||||
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í:
Código:
if (OpenDialog1.Execute) then begin if (Tabla.State <> dsBrowse) then Tabla.Edit; TablaFOTO.LoadFromFile(OpenDialog1.FileName); Tabla.Post; end;
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre. |
![]() |
|
|
![]() |
|