Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas para mostrar JPEG (https://www.clubdelphi.com/foros/showthread.php?t=28993)

dape 10-01-2006 05:02:35

Problemas para mostrar JPEG
 
¡hola amigos!, sí, sí ya sé que este tema ya se trato, es mas, he utilizado alguno de los concejos que se dan acá para mostrar imagenes jpeg almacenadas en una base de datos, pero nada, no me muestra nada.

Este es el código que utilizo para mostrar la imagen:

Código Delphi [-]
if (dmcpaf.MDOSPselect_afiliadoFOTO_AFIL.IsNull) then
//para registros sin foto poner imagen vacia
imgfoto.Picture:=nil
else
begin
imgfoto.Picture.Graphic:=TJpegImage.Create;
//copiar los datos desde la tabla con un stream
m:=dmcpaf.MDOSPselect_afiliado.CreateBlobStream(dmcpaf.MDOSPselect_afiliadoFOTO_AFIL, bmRead);
imgfoto.Picture.Graphic.LoadFromStream(m);
m.Free;
end;

al evaluarse el condicional, el resultado que obtengo es que el campo está vacío, aun esta contenga una imagen, la solución que encontre es negar el condicional, quedando de la siguiente manera:

Código Delphi [-]
if not (dmcpaf.MDOSPselect_afiliadoFOTO_AFIL.IsNull) then

al hacer este cambio ya puedo intentar mostrar la imagen, así que paso al bloque else...end y que creen ¡zas! salta un error, el "Error JPEG #42" y a decir verdad no sé que significa, pensé que a lo mejor estoy guardando mal imagen así ejecuto una consulta en el IBexpert y puedo ver la imagen, así que no creo que sea problema de mal guardado de la misma, por si acaso, esta la guardo con:

Código Delphi [-]
mdospputafiliado.ParamByName('foto_afil').LoadFromFile(s_imgpath,ftBlob);

donde s_imgpath es la ruta de la imagen a guardar.

utilizo delphi 7 y FB1.5, esto por si sirve de algo.

Espero puedan darme una idea de como solucionar mi problema y desde ya les doy las gracias por la ayuda que me brinden

Saludos desde Tacna - Perú

David

fidel 11-01-2006 16:32:09

Hola:

No se si será por la forma de guardar la imagen o por qué pero te copio el código que uso por si te sirve de algo. A mi me funciona bien en FireBird.

Como puedes ver guardo en un campo blob la foto y en un campo varchar el formato, por si hay fotos en formato .jpg o .bmp

Para mostrar la foto guardada uso un TImage, y para imprimirla con QuickReport un TQRImage .

DM. es un DataModule

Código Delphi [-]
uses
   ..... DB, Jpg, ...;


//cargar foto
procedure TFDatos.Cargarfoto1Click(Sender: TObject);
var
  m, f: TStream;
  s: string;
begin
  //se abre picturedialog para cargar fichero foto que se coja
  if dlgOpenPicture.Execute then
    begin
      //modo edición
      DM.IBDSAlumnos.Edit;
      //stream a partir campo Blob que contendrá la imagen
      m:= DM.IBDSAlumnos.CreateBlobStream(DM.IBDSAlumnosFOTO, bmWrite);
      //stream para acceder al archivo gráfico
      f:= TFileStream.Create(dlgOpenPicture.filename, fmOpenRead);
      //copiar de un stream a otro
      m.CopyFrom(f, f.Size);
      //coger formato foto y ponerlo en campo correspondiente
      s:= AnsiUpperCase(ExtractFileExt(dlgOpenPicture.FileName));
      if s='.JPEG' then
        s:= '.JPG';
      DM.IBDSAlumnosFORMATOFOTO.AsString:= Copy(s,2,3);
      DM.IBDSAlumnos.Post;
      //destruir streams
      f.Free;
      m.Free;
    end
end;

//borrar foto
procedure TFDatos.Borrarfoto1Click(Sender: TObject);
begin
  //borrar imagen
  ImageFoto.Picture.Assign(nil);
  //borrar foto del campo blob
  if (DM.IBDSAlumnos.State <> dsEdit) and (DM.IBDSAlumnos.State <> dsInsert) then
    DM.IBDSAlumnos.Edit;
  DM.IBDSAlumnosFOTO.Assign(nil);
  DM.IBDSAlumnos.Post;
end;

//mostrar imagen (evento on change de datasource)
procedure TFDatos.DSAlumnosFDataChange(Sender: TObject; Field: TField);
var
  m: TStream;
begin
  if DM.IBDSAlumnosFOTO.IsNull then
    //para registros sin foto poner imagen vacia
    ImageFoto.Picture := nil
  else
    begin
      if DM.IBDSAlumnosFORMATOFOTO.AsString = 'BMP' then
          //si es formato BMP
          ImageFoto.Picture.Graphic:= TBitmap.Create
      else if DM.IBDSAlumnosFORMATOFOTO.AsString = 'JPG' then
          //si es formato JPG
          ImageFoto.Picture.Graphic:= TJpegImage.Create
      else
        Exit;
      //copiar los datos desde la tabla con un stream
      m:= DM.IBDSAlumnos.CreateBlobStream(DM.IBDSAlumnosFOTO, bmRead);
      ImageFoto.Picture.Graphic.LoadFromStream(m);
      m.Free;
    end;
end;

Un saludo.

ElMug 21-07-2012 03:31:40

Pregunta sobre el codigo de este tema:
 
Hola amigos,

En este muy buen ejemplo, de mensajes anteriores, que he estado estudiando, quisiera saber EN QUE PARTE del codigo es en donde el dato Blob (la foto) se guarda a la base de datos, pues veo (eso si) la parte donde se guarda la extension del archivo (.bmp o .jpg) a su columna, mas no veo el codigo que corresponde a cuando se almacena el campo BLOB a la base de datos.

Solicito alquien me lo indique, y de faltar, alguien lo complete, por favor!

El codigo (pego aqui) es el del mensaje anterior "cargar foto":

Código:

[delphi]
//cargar foto
procedure TFDatos.Cargarfoto1Click(Sender: TObject);
var
  m, f: TStream;
  s: string;
begin
  //se abre picturedialog para cargar fichero foto que se coja
  if dlgOpenPicture.Execute then
    begin
      //modo edición
      DM.IBDSAlumnos.Edit;
      //stream a partir campo Blob que contendrá la imagen
      m:= DM.IBDSAlumnos.CreateBlobStream(DM.IBDSAlumnosFOTO, bmWrite);
      //stream para acceder al archivo gráfico
      f:= TFileStream.Create(dlgOpenPicture.filename, fmOpenRead);
      //copiar de un stream a otro
      m.CopyFrom(f, f.Size);
      //coger formato foto y ponerlo en campo correspondiente
      s:= AnsiUpperCase(ExtractFileExt(dlgOpenPicture.FileName));
      if s='.JPEG' then
        s:= '.JPG';
      DM.IBDSAlumnosFORMATOFOTO.AsString:= Copy(s,2,3);
      DM.IBDSAlumnos.Post;
      //destruir streams
      f.Free;
      m.Free;
    end
end;

Muchas gracias!

Casimiro Noteví 21-07-2012 09:58:23

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)


La franja horaria es GMT +2. Ahora son las 02:41:00.

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