Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Gráficos en una base de datos (https://www.clubdelphi.com/foros/showthread.php?t=2450)

mlara 24-07-2003 04:53:14

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.

SnaKe 24-07-2003 11: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:

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.

mlara 25-07-2003 01:19:22

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.

SnaKe 25-07-2003 09: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...

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 01: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:

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.

SnaKe 11-08-2003 08: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 03: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 17: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 17: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 12: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 19: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 20: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:

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).

Flycket 17-11-2003 23: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 17-11-2003 23: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 00: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 03:12:55

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.

allende 27-11-2003 22: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 03-05-2008 23: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:

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????:confused:

Gracias...
salu2

bladek1016 09-05-2008 06:15:22

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

mlara 09-05-2008 07: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í:

Código:

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



La franja horaria es GMT +2. Ahora son las 11:49:49.

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