PDA

Ver la Versión Completa : Recuperar IMAGEN de un QUERY


natalinuyo
12-02-2007, 18:00:21
HOLA:

Tengo un pequeño problema. Tengo un query que obtiene la clave de una persona y su fotografía. Lo que busco es que me muestre la foto de la persona...

Es muy simple pero no se que me falta. Intenté con el DBimage y el Datasource pero me dibuja solo la mitad de la imagen.

Probé codigo que encontré en Internet pero algo me esta faltando... me marca error en la linea donde le asigno la imagen al objeto del formulario.

Este es el codigo que probé, si me pueden ayudar a ver donde esta el error... De antemano gracias!

Var
Stream: TMemoryStream;
Jpg: TJpegImage;
Begin
Stream := nil;
Jpg := nil;
query1.SQL.Clear;
query1.Close;
query1.SQL.Text:='select * from foto where foto_cve='''+Edit1.text+'''';
query1.Open;
try
Stream := TMemoryStream.Create;
TBlobField(query1.FieldByName('FOTO_IMAGEN')).SaveToStream(Stream);
if Stream.Size > 0 then begin
Stream.Position := 0;
Jpg := TJpegImage.Create;
Jpg.LoadFromStream(Stream);
Image1.Picture.Assign(Jpg); :confused::confused::confused: Aqui marca error
...
...
... etc.

seoane
12-02-2007, 18:10:34
:confused: ¿y que error te da?

jhonny
12-02-2007, 18:22:47
Realmente seria muy bueno si nos aclararas cual es el error que te muestra pues no somos adivinos, pero de todas formas mira la pagina 369 del libro "La cara oculta de delphi 4" ofrecido gratuitamente en la pagina de Ian Marteens (http://www.marteens.com), allí te dice como capturar imagenes de la BD.

natalinuyo
12-02-2007, 18:27:14
El error que marca es:

Project xxx.exe raised exception class EJPEG with message ‘JPEG error #53’. Process stopped…

ContraVeneno
12-02-2007, 18:33:07
STFW
(http://mx.search.yahoo.com/search?p=JPEG+with+message+JPEG+error+%2353&prssweb=Buscar&ei=UTF-8&x=wrt&meta=all%3D1)
http://www.capmac.org/phpbb2/viewtopic.php?p=6884
Lo más problable es que la imagen sea muy grande y tengas problemas de memoria, prueba lo hacer lo mismo pero con una imagen más pequeña.

natalinuyo
12-02-2007, 18:46:49
Marca que no he declarado el identificador TBlobStream.

jhonny
12-02-2007, 18:55:31
Prueba cambiando el TStream por un TBlobStream y cambias la linea
TBlobField(query1.FieldByName('FOTO_IMAGEN')).SaveToStream(Stream); por
Stream := TBlobStream.Create(query1.FieldByName('FOTO_IMAGEN'),bmRead);
Y nos cuentas como te va.



Nota: habia eliminado este mensaje porque sencillamente me parecio que la sugerencia de Contraveneno era la correcta y no queria desviar a natalinuyo, pero ya que ha recibido el mensaje quizá por correo pues...


Marca que no he declarado el identificador TBlobStream.


Debes cambiar tambien arriba en las declaraciones despues del var el TMemoryStream Por TBlobStream.


Pero te recomiendo dos cosas:

1) Debes tener en cuenta la sugerencia de ContraVeneno.
2) Lee la pagina de el libro que te sugerí anteriormente.

natalinuyo
12-02-2007, 18:57:25
La imagen no creo que sea muy grande. La exporté desde un manejador de BD y ya como archivo el tamaño que me indica es de 298K.

jhonny
12-02-2007, 19:05:50
Bueno, y entonces ¿como te fue con lo del libro o con los cambios que te sugerí?

natalinuyo
12-02-2007, 19:07:15
:rolleyes:Se necesita alguna clase especial o algo así? me marca lo mismo sobre el identificador, el problema es que lo marca en el 'TBlobStream' no en la variable 'Stream'.

Con respecto al libro, llevo desde que me lo sugeriste hasta este momento y aun no lo baja... pero en eso estoy.:p

Y pues de la imagen, ustedes creen que sea el tamaño? como ya les expliqué mide menos de 300 k...

Tengo la idea de extraer la imagen y guardarla en un archivo BMP o JPG, el problema es que no se como hacerlo... tal vez esa sería la solución, ustedes que creen?

Gracias

seoane
12-02-2007, 19:09:38
Solo por curiosidad, en tu código introduce la siguiente linea:

//...
Stream := TMemoryStream.Create;
TBlobField(query1.FieldByName('FOTO_IMAGEN')).SaveToStream(Stream);


Stream.SaveToFile('c:\1.jpg'); // <-- Esta es la linea nueva


if Stream.Size > 0 then begin
Stream.Position := 0;
// ...


Así la imagen se guardara en el disco duro. Ahora abre la imagen con otro programa y comprueba que esta bien.

jhonny
12-02-2007, 19:16:41
Particularmente ya no creo que sea el tamaño, lo que si se me habia olvidado preguntar era el tipo de imagen que estabas manejando, desde un princio asumi que era JPG... Porque tenias declarada una variable de tipo TJpegImage.
tal vez esa sería la solución, ustedes que creen?
Quizá, Esperemos a que hagas la prueba de seoane, descargues el libro, pruebes el ejemplo que alli viene y si no funciona pues nos indicas que tipo de imagen quieres convertir a JPG, como te fue con la prueba de seoane y tratamos por ese otro lado.

natalinuyo
12-02-2007, 19:18:44
Ya probé bien la opcion de Seoane, sin embargo no crea bien el dibujo. El libro aun está en proceso.

Caral
12-02-2007, 19:34:57
Hola a todos
Perdon que me entrometa, para cargar una imagen de la tabla, que yo sepa no se necesita nada en especial ya que se toma como un archivo mas.
Yo dejaria esta parte y lo haria con el DBimage enlazado al datasource.

query1.SQL.Clear;
query1.Close;
query1.SQL.Text:='select * from foto where foto_cve='''+Edit1.text+'''';
query1.Open;

Ahora en el DBimage en la propiedad Stretch, la pasaria a True, con esto la imagen tomara la dimension del tamaño que le des al componente.
Digo todo esto porque asi lo hago yo y no tengo nigun problema, ademas si le cambio en propiedad los anchors, me la muestra mas grande si cambio la dimension del form.
Saludos

jhonny
12-02-2007, 19:37:06
1) Con cual codigo te muestra este ultimo error?.
2) Que tipo de conexion estas usando?
3) Si estas usando BDE. ¿Tienes la seguridad de que estas asignando el Alias correctamente y tienes conexion a dicha BD?

Este ultimo punto lo planteo porque veo que en el codigo que mostraste dice asi:

query1.SQL.Clear;
query1.Close;
query1.SQL.Text:='select * from foto where foto_cve='''+Edit1.text+'''';
query1.Open;

Aal parecer todo lo estas asignando en ejecución y veo que falta la propiedad databasename la cual no esta siendo asignada. y tal vez por eso te muestra este ultimo error, ;)

natalinuyo
12-02-2007, 20:46:49
Obviamente les simplifiqué el código.... EN cada query selecciono bien la tabla, el problema no es el query... me marca error hasta que le asigno la imagen Stream al objeto Image

COmo ya dije, me crea el archivo pero con error, es decir no sale nada de nada...

jhonny
12-02-2007, 20:50:50
Caramba, Que sucede si cambias.
Image1.Picture.Assign(Jpg);
Por

Image1.Picture.Graphic := Jpg;

Caral
12-02-2007, 20:56:00
Hola
Perdonen que insista pero si se dice esto:
Es muy simple pero no se que me falta. Intenté con el DBimage y el Datasource pero me muestra solo la mitad de la imagen.
Cambiando el parametro stretch seria suficiente.
Saludos

jhonny
12-02-2007, 21:01:00
Cambiando el parametro stretch seria suficiente

Claro¡¡¡, es cierto lo que dice Caral. Si desde un principio te muestra la imagen pues solo es cuestion de colocar la propiedad stretch en True y ya.

ContraVeneno
12-02-2007, 21:08:03
Yo pense que con "me muestra la imagen a la mitad", se refería a que la imagen estaba incompleta, por eso fue que pense en la falta de memoria para completar de cargar la imagen....

jhonny
12-02-2007, 21:13:44
"me muestra la imagen a la mitad"


Yo lo interprete de la misma manera, y ademas de eso me deje llevar por la "emoción" :D

Caral
12-02-2007, 21:15:42
Hola
Habria que ver que dice natalinuyo, tal vez estoy equivocado :D
Saludos

natalinuyo
12-02-2007, 21:26:10
No es lo que estan pensando... No es cosa del tamaño de la imagen, es decir de la foto completa del rostro de la persona, solo me DIBUJA la mitad...
ContraVeneno esta en lo cierto...

Sigo intentando...

Jhonny, esta parte ya la probé y no hay cambios.
Código Delphi [-] (http://www.clubdelphi.com/foros/newreply.php?do=newreply&noquote=1&p=182255#)Image1.Picture.Assign(Jpg);

Por

Código Delphi [-] (http://www.clubdelphi.com/foros/newreply.php?do=newreply&noquote=1&p=182255#) Image1.Picture.Graphic := Jpg;

Caral
12-02-2007, 21:29:40
Hola
Pregunto:
Si la foto esta en una bd, como es jpg ?
Saludos

natalinuyo
12-02-2007, 21:40:00
Que cosas no!

El punto es que donde tengo el query es un modulo aparte. Aparentemente me falta algo en uses dado que cuando coloco el TblobStream en este modulo me marca que no lo reconoce...

Para probar lo coloqué en el .pas principal (donde esta todo el rollo de los objetos y cosas de esas) y ahí no marca error...

Pero... yo lo necesito en el submodulo, porque solo ahí puedo poner el Query...

Pero pues se me agotan las opciones, creo que hemos probado de casi todo...

Por cierto ya chequé el Libro, pero dada mi situación creo que no es de mucha ayuda.... :)

Saludos

Caral
12-02-2007, 21:50:32
Hola natalinuyo
Me sigue intrigando:
La imagen esta en una base de datos?
La imagen esta completa en la base de datos?
Para mi si la imagen esta en la base de datos, cargara, sea del tamaño que sea, lo que podria variar es la velocidad de carga, no la imagen.
Pregunto:
Donde esta la imagen?
Que base de datos usas?
Simple curiosidad
Saludos

natalinuyo
12-02-2007, 22:14:58
Ok

La imagen es una fotografía de una persona.

La imagen esta almacenada en una BD Oracle...

La imagen la obtengo por medio de una consulta que hago a la tabla FOTO.

Tengo otro fomulario donde capturo las fotos de las personas, en esa pantalla no tengo mayor problema. En esta pantalla manejo un TDBImage y uso la propiedad DataSource, en esta ventana SI me muestra la foto ya desde la tabla... Sin embargo en esta otra pantalla no funciona... Solo me dibuja la mitad de la foto.:(

Caral
12-02-2007, 22:24:52
Hola natalinuyo
Hay un dicho que dice, lo que es bueno para el ganso es para la gansa.
Osea si ves la foto en el primer form, no veo la razon de no verla en el segundo.
Sinceramente no veo la relacion que se quiere dar al query o al uses en esto, el query simplemente hace un enlace con la tabla, el datasource hace un enlace con el TDBImage y se muestra la informacion, no veo cual es el problema, y el uses pues simplemente liga form, viendolo sencillamente.
Como sugerencia, seguiria los pasos que hiciste en el primer form y los copio al segundo, cual es el problema que sea otro form diferente?
Saludos

natalinuyo
12-02-2007, 22:32:10
Esto es lo ultimo.... :p

Ok, ya tengo la foto de la BD, esta en memoria.
Guardo la imagen en disco duro:
Stream.SaveToFile('c:/foto.bmp');

Para mostrarla en pantalla, le cargo la imagen desde el archivo:

Image1.Picture.Bitmap.LoadFromFile('c:/foto.bmp');


Pues funciona... pero una vez más me DIBUJA solo la mitad!?!

NOTA: Cuando intento abrir el archivo de imagen desde el disco duro, marca que el archivo tiene error... aun así me muestra la mitad de la foto en pantalla :confused:

natalinuyo
12-02-2007, 22:38:43
Hola natalinuyo
Como sugerencia, seguiria los pasos que hiciste en el primer form y los copio al segundo


Pues la vdd, fue lo primero que intenté... y ahí comenzó todo el show y mi complicación... Por eso :confused: No entiendo... como es posible que en un formulario funcione perfectamente y en otro no; si en esa parte HACEN LO MISMO?!?! :rolleyes:

Caral
12-02-2007, 22:46:53
Hola
Te aconsejo hacer una prueba simple.
Haz un enlace con un table, no con un query a la tabla donde esta la foto.
Coloca un datasource y un dbnavegator ligados al table.
Coloca un dbimagen ligado al datasource ligado al campo donde estan las fotos.
Corre el form y con el navegator recorre la tabla.
A ver si se muestran as fotos, completas o incompletas o si de plano no se muestran.
Lo que no me parece necesario es recoger una foto de la bd, colocarla en memoria, grabarla en disco y luego llevarla al form, es mucho trabajo innecesario.
Prueba esto ultimo, es lo mas sencillo, y ya diras
Saludos

natalinuyo
12-02-2007, 23:22:22
Porque será que hay problemas con el query?:confused:

Es algo confuso que cuando hago referencia directo a la tabla dibuje completas las fotos, pero al momento de utilizar el query solo dibuje la mitad.

Por el momento lo he dejado por la paz.

Les agradezco a todos por haberme ayudado.

Pero si alguien sabe el 'meollo' (la vdd no se como se escribe :p ) del problema es Bienvenido.:o