Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Error jpeg #41 al cargar imagen en TImage (https://www.clubdelphi.com/foros/showthread.php?t=25063)

Repelus 10-09-2005 20:46:54

Error jpeg #41 al cargar imagen en TImage
 
Saludos compañeros,

Después de buscar mucho por el foro, no consigo resolver este error, espero me podais ayudar.
Lo que hago es cargar una imagen en un TImage en el evento afterscroll del dataset, para ello utilizo el código facilitado en un hilo del foro.
Código:

var
  B  : TJPEGImage;
  MS : TMemoryStream;
begin
    B := TJPEGImage.Create;
    MS := TMemoryStream.Create;
    q_trabajadoresfoto.SaveToStream(MS);
    B.LoadFromStream (MS);
    foto.Picture.Assign (B);
    MS.Free;
    B.Free;
end;

Tambien he de decir que he incluido en las uses jpeg;
Seguramente será alguna tonteria pero no doy con ella.

jmariano 10-09-2005 22:33:23

Tu problema, seguramente, es que el campo Blob no tiene almacenada la imagen en formato jpeg (de ahí el error en el formato), así que tendrás que usar la clase TBitmap en vez de TJPEGImage.

Código Delphi [-]
var
  MS: TMemoryStream;
  B: TBitmap;
begin
  if not q_trabajadoresfoto.IsNull then
  begin
    MS := TMemoryStream.Create;
    B := TBitmap.Create;
    q_trabajadoresfoto.SaveToStream(MS);
    B.LoadFromStream(MS);
    foto.Picture.Assign(B);
    MS.Free;
    B.Free;
  end
  else foto.Picture := nil;

Saludos!

Repelus 10-09-2005 22:40:31

Gracias por responder a mi problema, lo probaré y ya mañana contaré como me fue.
Saludos.

Repelus 11-09-2005 11:25:09

Saludos, JMariano,
He probado por fin lo que me dijiste y efectivamente ya no se produce ningún error, pero las imagenes no se muestran en el 'TImage', existen grabados 5 o 6 registros de prueba, algunos con el campo imagen nulo, otros con BMPs y uno con un JPEG, pero ningún registro muestra nada. ¿que falla ahora?.

Otra cosa que me interesaria es poder mostrar indistintamente cualquier formato que soporte el componente TImage pues por parte de la base de datos no tengo problemas ya que estoy utilizando Interbase 6.0 y el campo blob se come cualquier cosa.

Saludos.

jmariano 12-09-2005 16:10:09

No se bien porque quieres usar el control TImage pero ¿Porque no pruebas con el control TDBImage? Este control te permite, precisamente, visualizar las imágenes de tu base de datos sin necesidad de tener que actualizarlo en el evento "AfterScroll" (además, puedes hacerlo de sólo lectura, a través de la propiedad "ReadOnly", si no quieres que nadie pueda modificar la imagen en el mismo control).

Otra cosa, ¿Como estás almacenando las imágenes en la base de datos? (Te lo pregunto porque la últime vez que tuve esta necesidad, nunca conseguí almacenarlas como jpeg sino siempre como bitmap. Es decir, siempre las tenía que almacenar "descomprimidas").

Saludos!

P.D: Aunque necesites usar el control TImage, prueba a usar TDBImage para comprobar que se visualizan las imágenes, ya que si no fuera así es que algún problema está habiendo en la base de datos.

Repelus 12-09-2005 21:27:36

El control TdbImage fue lo primero que empleé pero me daba error precisamente cuando intentaba grabar un jpeg, por lo demás se visualiza perfecto(cuando es un bmp). Así pues, hallé la respuesta en el foro y era que el dbImage no funciona bien con jpeg, no recuerdo ahora el error que me daba, pero se aconsejaba utilizar la clausula jpeg en el uses. Así lo hice y seguía sin funcionar por lo que decidí quitar el control y utilizar un TImage.

El codigo para cargar la imagen al control también lo saqué del foro (a través del TMemorystream), con estos cambios todo deberia funcionar y ya no salta ningún error pero sigue sin salir la imagen.
Código Delphi [-]
if not q_trabajadoresfoto.IsNull then
     begin
     B := TBitmap.Create;//TJPEGImage.Create;
     MS := TMemoryStream.Create;
     q_trabajadoresfoto.SaveToStream(MS);
     B.LoadFromStream (MS);
     foto1.Picture.Assign(B);
     MS.Free;
     B.Free;
     end
     else
     foto1.Picture := nil;
Lo único que no he probado es refrescar el control despues de hacerle la asignacion de la variable o tal vez un 'repaint'.

Voy a probarlo ahora y te cuento...

Saludos.

Repelus 12-09-2005 21:35:10

Me sigue sin funcionar....

Ya no se de que puede ser...

Estoy en blanco...

Haber si se te ocurre algo JMariano y gracias de antemano pero es que me monto unos lios imposibles.

jmariano 13-09-2005 03:50:59

El problema es que jpeg es un formato comprimido de imagen que, ademas de la imagen, puede contener información adicional, y es por esta información, precisamente, por la que puede que te esté dando error (tambien es por esto que no se puede usar un control DBImage con un jpg, ya que no sabe como manejar dicha información). Así que para hacer lo que quieres tendrás que hacer alguna operación extra además de cargar la imagen. Leete el siguiente artículo que te va ayudar mucho: http://delphi.about.com/od/database/l/aa030601a.htm (los ejemplo son para ADO, pero lo puedes adaptar tanto para BDE como para InterBase o para el ClientDataSet)

Saludos!

Repelus 13-09-2005 11:18:42

Gracias por la información, estudiaré el tema y ya comentaré los resultados.

Saludos.

Repelus 15-09-2005 21:18:04

Hola JMariano,
he encontrado la solución por fin. Al final encontré otro articulo que me resulto quizas más claro he interesante para dar solucion a mi problema. Además ya lo he probado y funciona muy bien.
Aquí pongo el enlace para que todos puedan echarle un vistazo. Desde luego recomiendo su lectura atentamente.
www.latiumsoftware.com/es/pascal/0011.php

Por último muchas gracias por tu interes y tu ayuda.


Saludos. :)


La franja horaria es GMT +2. Ahora son las 08:00: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