Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-07-2003
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 21
mlara Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 24-07-2003
Avatar de SnaKe
SnaKe SnaKe is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid (España)
Posts: 227
Poder: 21
SnaKe Va por buen camino
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;
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:

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.
__________________
Todos somos aficionados. La vida es tan corta que no da para más.
Guia de Estilos
Responder Con Cita
  #3  
Antiguo 25-07-2003
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 21
mlara Va por buen camino
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;
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.
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.
Responder Con Cita
  #4  
Antiguo 25-07-2003
Avatar de SnaKe
SnaKe SnaKe is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid (España)
Posts: 227
Poder: 21
SnaKe Va por buen camino
Hola,

Todo tiene remedio... jejeje 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...

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.
__________________
Todos somos aficionados. La vida es tan corta que no da para más.
Guia de Estilos
Responder Con Cita
  #5  
Antiguo 05-08-2003
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 21
mlara Va por buen camino
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;
, 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í:

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;
De nuevo muchas gracias por su ayuda.
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.
Responder Con Cita
  #6  
Antiguo 11-08-2003
Avatar de SnaKe
SnaKe SnaKe is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid (España)
Posts: 227
Poder: 21
SnaKe Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 06-09-2003
pgraciap pgraciap is offline
Miembro
 
Registrado: may 2003
Ubicación: Tampico, Tamaulipas [Mexico]
Posts: 39
Poder: 0
pgraciap Va por buen camino
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 :)
Responder Con Cita
  #8  
Antiguo 13-11-2003
Flycket Flycket is offline
Registrado
 
Registrado: nov 2003
Posts: 7
Poder: 0
Flycket Va por buen camino
Exclamation

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
Responder Con Cita
  #9  
Antiguo 14-11-2003
pgraciap pgraciap is offline
Miembro
 
Registrado: may 2003
Ubicación: Tampico, Tamaulipas [Mexico]
Posts: 39
Poder: 0
pgraciap Va por buen camino
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 :)
Responder Con Cita
  #10  
Antiguo 17-11-2003
Flycket Flycket is offline
Registrado
 
Registrado: nov 2003
Posts: 7
Poder: 0
Flycket Va por buen camino
Exclamation

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
Responder Con Cita
  #11  
Antiguo 17-11-2003
Flycket Flycket is offline
Registrado
 
Registrado: nov 2003
Posts: 7
Poder: 0
Flycket Va por buen camino
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
Responder Con Cita
  #12  
Antiguo 17-11-2003
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 21
mlara Va por buen camino
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);
En el código anterior el error estaba aquí:

Código:
  // 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).
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.
Responder Con Cita
  #13  
Antiguo 18-11-2003
Flycket Flycket is offline
Registrado
 
Registrado: nov 2003
Posts: 7
Poder: 0
Flycket Va por buen camino
Exclamation

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
Responder Con Cita
  #14  
Antiguo 18-11-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
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).
Responder Con Cita
  #15  
Antiguo 18-11-2003
Flycket Flycket is offline
Registrado
 
Registrado: nov 2003
Posts: 7
Poder: 0
Flycket Va por buen camino
Red face

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...
Responder Con Cita
  #16  
Antiguo 20-11-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
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;
Como puedes ver hay un posicionamiento al inicio del Stream (mediante un Seek)

Pruébalo a ver.

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #17  
Antiguo 27-11-2003
allende allende is offline
Miembro
 
Registrado: nov 2003
Posts: 19
Poder: 0
allende Va por buen camino
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
Responder Con Cita
  #18  
Antiguo 04-05-2008
Avatar de Radesky
Radesky Radesky is offline
Miembro
 
Registrado: may 2008
Posts: 10
Poder: 0
Radesky Va por buen camino
[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;
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????

Gracias...
salu2

Última edición por Radesky fecha: 04-05-2008 a las 00:57:23. Razón: duda un poco aclarada
Responder Con Cita
  #19  
Antiguo 09-05-2008
bladek1016 bladek1016 is offline
Registrado
 
Registrado: may 2008
Posts: 1
Poder: 0
bladek1016 Va por buen camino
Question Duda con TablaFoto

Código:
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
Responder Con Cita
  #20  
Antiguo 09-05-2008
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 21
mlara Va por buen camino
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 13:28:04.


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
Copyright 1996-2007 Club Delphi