Ir al contenido


Foto

Problema con JPEG desde campo Blob de MySQL


  • Por favor identifícate para responder
5 respuestas en este tema

#1 cesarfgt

cesarfgt

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 24 octubre 2011 - 09:36

Buen dia a todos tengo un problema con imagenes JPEG desde campo Blob en base de datos MySQL.

Requiero almacenar imagenes JPEG en campo Blob de MySQl mediante sentecial SQL y visualizar las imagenes almacenadas en un campo DBImage o TImage, recuperando mediante sentiencias SQL, es decir sin usar TTable o ADOTable solo usando TSQL.

Pongo el codigo que estoy utilizando para almacenar las fotos en el campo IMAGEN de tipo Blob en la base en MySQL y de igual forma pongo el codigo que utilizo para recuperar las imagenes, hasta este momento no se si las imagenes se almacenan correctamente en el campo blob ya que no logro visualizar las imagenes.

Alguien que me ayude por favor a resolver el problema.
Y aprovechando este mismo codigo podria usarse para almacenar documento en formato DPF?

CODIGO QUE UTILIZO PARA ALMACENAR/GUARDAR LA IMAGEN JPEG EN CAMPO BLOB



delphi
  1. procedure TFormDigitaVale.Button1Click(Sender: TObject);
  2. Var
  3.   xSQl:String;
  4.   MS : TMemoryStream;
  5. begin
  6.   imgFoto.Picture.LoadFromFile('65ca57.jpg');  //imagen que guardo, esto solo es temporal la idea es escanear el documento y guardarlo.
  7.   imgFoto.Stretch:=TRUE;  //imgFoto es un componente TImage que permita visualizar la imagen que se almacena
  8.  
  9.   with DM1.QueryDM do
  10.   begin
  11.     Close;
  12.   SQL.Clear;
  13.   xSQL := ' Insert into repositorio (IDAlmacen,Anio,NoFacReq,Titulo,Imagen) ';
  14.     xSQL := xSQL + ' Values (0,"2011","'+EditNumSalida.Text+'","descipcion de documento",:xDocumento)';  //EditNumSalida es el folio que asigno a la imagen para despues recuperar
  15.   SQL.Add(xSQL);
  16.     ParamByName('xDocumento').DataType := ftBlob;  //se supone indico al campo blob que la imagen es blob
  17.     ParamByName('xDocumento').LoadFromFile('65ca57.jpg', ftBlob);  //cargo la imagen en campo blob
  18.   ExecSQL;  // ejecuto el SQL
  19.   end;
  20. end;



Codigo que utilizao para recuperar la imagen desde campo Blob de BD MySQL y que deberia ser visuaizada en un TImagen.



delphi
  1. procedure TFormDigitaVale.Button2Click(Sender: TObject);
  2. var
  3.   imgJPG:TJpegImage;
  4.   blobF:TBlobField;
  5.   // Jpeg:TJpegImage;
  6.   Corriente:TMemoryStream;
  7.   fs : TMemoryStream;
  8.  
  9.   xSQl:String;
  10. begin
  11.   imgJPG := TJpegImage.create;
  12.   with DM1.QueryRepositorio do begin
  13.  
  14.     SQL.Clear;
  15.     SQL.Add('SELECT * FROM repositorio WHERE IDAlmacen= 0
  16.           ' and anio=2011 and NoFacReq='+EditNumSalida.Text+' ');
  17.     Open;
  18.     if RecordCount = 1 then begin
  19.       (FieldByName('imagen') as TBlobField).SaveToStream(fs);
  20.       imgJPG.LoadFromStream(fs);
  21.       with DM1.TableRepositorioImagen do begin
  22.         imgFoto.Picture.Assign(imgJPG);  // imgFOTO es un componente TImage
  23.         imgFoto.Visible := True;
  24.         ImgFoto.Refresh;
  25.       end;
  26.     end;
  27. //  Close;  //Evito cerrar el query que recupera la consulta pensado que se cerraba y que la imagen ya no se visualizaba
  28.   end;
  29.   fs.Free;
  30.   imgJPG.Free;
  31. end;


  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 24 octubre 2011 - 11:08

Pues como no dices si te da algun error o que al compilar, pero viendo el codigo de cargar vi que te falto una comilla simple y el signo de + en la consulta, pruebalo y nos comentas:



delphi
  1. procedure TFormDigitaVale.Button2Click(Sender: TObject);
  2. var
  3.   imgJPG:TJpegImage;
  4.   blobF:TBlobField;
  5.   Corriente:TMemoryStream;
  6.   fs : TMemoryStream;
  7.  
  8.   xSQl:String;
  9. begin
  10.   imgJPG := TJpegImage.create;
  11.   with DM1.QueryRepositorio do begin
  12.  
  13.     SQL.Clear;
  14.     SQL.Add('SELECT * FROM repositorio WHERE IDAlmacen= 0 ' +
  15.           ' and anio=2011 and NoFacReq='+EditNumSalida.Text+' ');
  16.     Open;
  17.     if RecordCount = 1 then begin
  18.       (FieldByName('imagen') as TBlobField).SaveToStream(fs);
  19.       imgJPG.LoadFromStream(fs);
  20.       with DM1.TableRepositorioImagen do begin
  21.         imgFoto.Picture.Assign(imgJPG);  // imgFOTO es un componente TImage
  22.         imgFoto.Visible := True;
  23.         ImgFoto.Refresh;
  24.       end;
  25.     end;
  26. //  Close;  //Evito cerrar el query que recupera la consulta pensado que se cerraba y que la imagen ya no se visualizaba
  27.   end;
  28.   fs.Free;
  29.   imgJPG.Free;
  30. end;


  • 0

#3 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 24 octubre 2011 - 03:09

Por un lado primero probaria a "rebobinar" el stream antes de leerlo, con un



delphi
  1.       fs.position:= 0; //Añadido
  2.       imgJPG.LoadFromStream(fs);
  3.       imgJPG.position:= 0; //Añadido
  4.       with DM1.TableRepositorioImagen do begin
  5.         imgFoto.Picture.Assign(imgJPG);  // imgFOTO es un componente TImage
  6.         imgFoto.Visible := True;
  7.         ImgFoto.Refresh;
  8.       end;



Si con esto no funciona, yo tube problemas similares recuperando JPEGS, y el problema era que el tamaño del JPEG no estaba muy claro y el stream terminaba siendo mayor de lo que debia.

Lo solucione guardando el tamaño del stream al momento de grabarlo junto al propio stream, y luego, tras leerlo, copiaba a un TMemoryStream solo la cantidad de bytes que tenia guardado como tamaño original, y ese era el stream que usaba para cargar la imagen.



delphi
  1.       fs.position:= 0; //Añadido
  2.       //imgJPG.LoadFromStream(fs); //Eliminado
  3.       imgJPG.CopyFrom(fs, BytesStreamOriginal); //Añadido
  4.       imgJPG.position:= 0; //Añadido
  5.       with DM1.TableRepositorioImagen do begin
  6.         imgFoto.Picture.Assign(imgJPG);  // imgFOTO es un componente TImage
  7.         imgFoto.Visible := True;
  8.         ImgFoto.Refresh;
  9.       end;



  • 0

#4 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 24 octubre 2011 - 03:16

ESPERA, el problema de rebobinar el stream es muy secundario, no estas cargando el fichero jpeg en el TImage correctamente, asi no te puede funcionar!



delphi
  1. //La linea de abajo creo que solo es para .BMPs
  2. //imgFoto.Picture.Assign(imgJPG);  // imgFOTO es un componente TImage
  3. //Cambiala por estas otras dos:
  4. imgFoto.Graphic:= TJPEGImage.create;
  5. TJPEGImage(imgFoto.Graphic).LoadFromStream(imgJPG);


  • 0

#5 cesarfgt

cesarfgt

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 25 octubre 2011 - 12:14

Sergio.

Voy a realizar los cambios que me planteas, gracias por la ayuda, escribire mi comentario una vez que haya probado los cambios.

Gracias.
  • 0

#6 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 142 mensajes
  • LocationMéxico

Escrito 22 enero 2019 - 09:58

De todo esto me salió una pregunta, pude cargar y visuaizar a imagen en un Timagen con sus aporte y ayudas, muchas gracias . pero me salto un detalle..

 

Supongamos que en ya hice la consulta y ya me visualizo en el Timagen la FOTO que estaba en la BD, pero ... si quisiera DESCARGAR esa imagen a fichero JPG (en mi caso) ? ... osea despues de una ocnsulta y me muestre la imagen, como seria la forma para descargar esta imagen a la PC nuevamente?

 

Gracias .. 


  • 0




IP.Board spam blocked by CleanTalk.