PDA

Ver la Versión Completa : Problema extrayendo campo imagen de una tabla access


JoysticK
27-07-2008, 23:02:35
Hola, pues me estoy volviendo loco, creo que en el foro estaba la solucion pero no consigo encontrarla :(

Tengo que exportar datos de una tabla access, pero esta tiene un campo OLE en el que en teoria hay una imagen guardada, digo en teoria porque si abro la tabla con access en el campo me aparece MS Photo Editor 3, y cuando intento abrirla con doble click me tira un error "El Servidor OLE no esta registrado", esto será porque no tengo el Ms Photo Edito ese instalado...

Bueno la cosa es que tengo que exportar los datos de esa tabla a interbase, con el resto de campos no hay problemas pero este es taco raro, si intento vizualizar la tabla con componentes de ado el TDBImage asignado a este campo me tira el error "Bitmap image is not valid", he leido sobre exportar este tipo de campos por ejemplo estos ejemplos http://delphi.about.com/od/database/l/aa030601d.htm, pero me da a mi que no es un jpg lo que hay guardado ahi dentro porque los ejemplos no sirven con este campo...

alguna idea de como saber que tipo de imagen hay ahi almacenada y como extraerla ?

Haberla haila porque en 300 registros se come 2 GB, asi que tiene que haber imagenes ahi dentro pero no encuentro la forma de sacarlas...


EDITO

Acabo de instalar el ms photo editor ese y si, dentro de ese campo hay una imagen.. como narices la saco ?

Una ayuda por favor que estoy desesperado :(

JoysticK
28-07-2008, 09:57:22
He enctontrado este texto, por lo que entiendo creo que tiene bastante coerencia:


ole embedding is terrible because of this: it's not embedded data in a known format, it's embedded data in whatever random proprietary format the software wanted to use, so you now have word docs and access databases which contain data which can't be read by any supported microsoft software.He estado haciendo investigaciones, por lo que he averiguado cada formato de imagen, a la hora de almacenarse en un fichero tienen un encabezado hexadecimal en particular, BMP 42 4D, GIF 47 49 46, PNG 89 50 4E 47, TIFF 49 49 2A 00, JPG FF D8, estos son algunos de esos encabezados que definen el inicio de una imagen, pues utilizando estos encabezados he buscado en mi campo imagen de access y no encuentro ninguno de estos encabezados lo que me da que suponer lo dicho anteriormente, las imagenes estan guardadas en un formato propietario de MS Photo Editor y extraerlas me va a costar bastante, si es que lo consigo...

JoysticK
28-07-2008, 20:46:34
Nada, no hay forma, lo tendré que dejar por imposible :(

juanlaplata
01-08-2008, 13:51:43
Bueno, espero no sea tarde, aqui como lo uso, es con "JPG", pero tal ves puedas adaptarlo a "BMP", si es que son de ese tipo.

// Referencias
// Base = DataModule
// DatosImagenReportes
// -> Datos = Tabla ,
// -> ImagenReportes = Campo Tipo Objeto OLE de Access

var BS:TBlobStream;
Grafico :TGraphic;
begin
if(Base.DatosImagenReportes.IsNull)then

begin
Image1.Picture.Graphic:=nil;
end

else begin
BS := TBlobStream(Base.Datos.CreateBlobStream(Base.DatosImagenReportes,bmRead));
try
grafico:= TJPEGImage.Create;
try
grafico.LoadFromStream(BS);
Image1.Picture.Graphic := grafico;
finally grafico.Free; end;
finally BS.Free; end;
end;
end;

JoysticK
04-08-2008, 01:45:03
Numca es tarde si la dicha es buena jeje, pero nada tampoco me funciona tu codigo, cuando llega a la linea:


grafico.LoadFromStream(BS);
Me devuelve el error:


JPEG ERROR #52
He probado a cambiar la linea:


grafico:= TJPEGImage.Create;
por:


grafico:= TBitmap.Create;
Y me devuelve el siguiente error en la misma linea de antes:


Bitmap image is not valid.
Estoy por subiros la base de datos con un registro a ver si alguien es capaz de sacar esa imagen, ya es por orgullo xDDD

waly2k1
05-08-2008, 21:28:05
( TABLA.FindField( 'FOTO' ) As TBlobField).SaveToFile( sFileFOTO ); // grabo la foto
imgFoto.Picture.LoadFromFile( sFileFOTO ); // muestro en un control image
// Y Si quiero guardar una foto
( TABLA.FindField( 'FOTO' ) As TBlobField ).LoadFromFile( sFileFOTO );



donde tabla es un objeto tabla, como puede ser query
sFileFOTO es la ruta y nombre del archivo donde quiero guardar

Bueno espero te sirva, y no te rindas tan facilmente
Walter

JoysticK
07-08-2008, 16:06:12
[code]
Bueno espero te sirva, y no te rindas tan facilmente
Walter

Gracias por los animos Walter, pero eso fue lo primero que probe a grabar el contenido del campo en un fichero, ese fichero, le ponga la extension que le ponga no es reconocido como una imagen, por lo que he leido es porque access guarda en la cabecera del campo donde se inserta la imagen datos como con que programa se abre (MS Photo Editor) la ruta y paranoias varias, corrompiemdo el fichero original...

Os subo un ejemplo de esta tabla, 1 REGISTRO, con 1 SOLO CAMPO, la imagen, a ver quien tiene narices de extraer esa imagen mediante codigo...

http://rapidshare.com/files/135562566/1registro1campo.rar.html

Lo mejor es que 1 Registro con 1 campo ocupa unos 25 MB.... bueno lo he comprimido con winrar ahora pesa 6 MB... como me gusta accesss.....

waly2k1
07-08-2008, 21:04:21
Hola JoysticK
Es extraño el tamaño de la imagen
compacto la BD y me reduce de 26 mb a 8 nose como lo guardas pero
con las rutinas que te pasé funciona a la perfeccion con Access.

Y cuando visualizo un registro me aparece el texto Datos Binarios Largos en los campos que son Objeto OLE. Y no así Imagen de MS Photoeditor 3 o lo que fuera que estes guardando ahí, o sea que no estas guardando una imagen
pura sino con formato propio tipo .PSD de photoshop, ademas por el peso
para ser jpg debería ser muy enorme la foto/imagen.

Asi que deberias comenzar por cargar imagenes jpg o bmp sin formatos
propios de una aplicación, o bien guardaste como jpg algo con otro
formato ya que no es suficiente elegir la extension al guardar.

A continuación te copio unas lineas que hago por si es bmp o jpg una imagen, se que hay maneras mas sencillas de hacerlo, pero en su
momento fue lo que se me ocurrio. No es indistinto para el objeto
image si es bmp o jpg pq genera una excepcion

if not qryEMP.FieldByName( 'FOTO' ).IsNull then
begin
sTypeFOTO := Copy( AnsiString( qryEMP.FieldByName( 'FOTO' ).Value ), 1, 2 );
if sTypeFOTO = 'BM' then // Es BMP ?
begin
sFOTO := sMainFolder + 'IMGs\TEMP_' + IntToStr( iEmpleado ) + '.bmp';
end
else
begin
sFOTO := sMainFolder + 'IMGs\TEMP_' + IntToStr( iEmpleado ) + '.jpg';
end
end;

imgFoto.Picture := nil;
if FileExists( sFOTO ) then
begin
DeleteFile( PChar( sFOTO ) );
end;

if not qryEMP.FieldByName( 'FOTO' ).IsNull then
begin
( qryEMP.FindField( 'FOTO' ) As TBlobField).SaveToFile( sFOTO );
imgFoto.Picture.LoadFromFile( sFOTO );
end;



Saludos y espero te sirva de algo. Fijate bien q estas guardando, que sea una imagen jpg o bmp y no formatos extraños

JoysticK
08-08-2008, 03:00:07
La cosa es que no se que como han guardado esos campos, lo que se seguro es que son imagenes, documentos escaneados a una resolucion bastante bestia por eso el peso, el problema es que no se exactamente como han metido esas imagenes en ese campo pues me han encargado importar esa base datos a interbase pero me encuentro con el problemita de la imagen de las narices..

¿ Has conseguido exportar la imagen de la base de datos que te he subido como ejemplo ?

Es que yo no consigo guardar el contenido de ese campo a ningun fichero que despues me reconozca como una imagen :(

con el Copy( AnsiString( qryEMP.FieldByName( 'FOTO' ).Value ), 1, 2 ), estas copiando los primeros 2 caracteres del string conetenedor de la foto no ? y miras si es BM o JPG, pero no estos campos no se como los han guardado, si abres el fichero exportado mediante campo.savetofile con un editor hexadecimal vas a ver que cosas mas raras tiene en al cabecera del fichero...

Un ejemplo del comienzo de un fichero exportado mediante savetofile abierto con editor binario:


; / ÿÿÿÿFotografía de Photo Editor MSPhotoEd.3 MSPhotoEd.3 8Y ÐÏࡱá > þÿ Z þÿÿÿ

! " # $ % & ' ( ) * + , - . / M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿL þÿÿÿþÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿ ýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿ1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € R o o t E n t r y ÿÿÿÿÿÿÿÿ @9”Þ6Ï•> À¨@)é °(V¨^ðÈ @ O l e
ÿÿÿÿÿÿÿÿÿÿÿÿ


como puedes ver el principio del fichero ni es BM, ni JP ni leches... a saber en que se guarda esto :(