Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-07-2008
Avatar de JoysticK
JoysticK JoysticK is offline
Miembro
 
Registrado: abr 2004
Posts: 68
Poder: 21
JoysticK Va por buen camino
Problema extrayendo campo imagen de una tabla access

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

Última edición por JoysticK fecha: 28-07-2008 a las 01:02:16.
Responder Con Cita
  #2  
Antiguo 28-07-2008
Avatar de JoysticK
JoysticK JoysticK is offline
Miembro
 
Registrado: abr 2004
Posts: 68
Poder: 21
JoysticK Va por buen camino
He enctontrado este texto, por lo que entiendo creo que tiene bastante coerencia:

Código:
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...
Responder Con Cita
  #3  
Antiguo 28-07-2008
Avatar de JoysticK
JoysticK JoysticK is offline
Miembro
 
Registrado: abr 2004
Posts: 68
Poder: 21
JoysticK Va por buen camino
Unhappy

Nada, no hay forma, lo tendré que dejar por imposible
Responder Con Cita
  #4  
Antiguo 01-08-2008
Avatar de juanlaplata
juanlaplata juanlaplata is offline
Miembro
 
Registrado: ene 2007
Ubicación: La Plata, Bs. As. (Argentina)
Posts: 212
Poder: 18
juanlaplata Va por buen camino
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.
Código Delphi [-]
// 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;
Responder Con Cita
  #5  
Antiguo 04-08-2008
Avatar de JoysticK
JoysticK JoysticK is offline
Miembro
 
Registrado: abr 2004
Posts: 68
Poder: 21
JoysticK Va por buen camino
Numca es tarde si la dicha es buena jeje, pero nada tampoco me funciona tu codigo, cuando llega a la linea:

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

Código:
JPEG ERROR #52
He probado a cambiar la linea:

Código:
grafico:= TJPEGImage.Create;
por:

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

Código:
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
Responder Con Cita
  #6  
Antiguo 05-08-2008
waly2k1 waly2k1 is offline
Miembro
 
Registrado: dic 2006
Ubicación: El país de las maravillas(Argentina)
Posts: 251
Poder: 18
waly2k1 Va por buen camino
Código:
( 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
Responder Con Cita
  #7  
Antiguo 07-08-2008
Avatar de JoysticK
JoysticK JoysticK is offline
Miembro
 
Registrado: abr 2004
Posts: 68
Poder: 21
JoysticK Va por buen camino
Exclamation

Cita:
Empezado por waly2k1 Ver Mensaje
[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/13556256...campo.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.....
__________________
Borland Delphi XE2 // Interbase Server
Responder Con Cita
  #8  
Antiguo 07-08-2008
waly2k1 waly2k1 is offline
Miembro
 
Registrado: dic 2006
Ubicación: El país de las maravillas(Argentina)
Posts: 251
Poder: 18
waly2k1 Va por buen camino
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

Código:
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
Responder Con Cita
  #9  
Antiguo 08-08-2008
Avatar de JoysticK
JoysticK JoysticK is offline
Miembro
 
Registrado: abr 2004
Posts: 68
Poder: 21
JoysticK Va por buen camino
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:

Código:
;       / ÿÿÿÿ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
__________________
Borland Delphi XE2 // Interbase Server
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Agregar campo en una tabla access desde delphi Chogo Tablas planas 1 10-10-2007 21:22:42
Grabar Imagen en Tabla Access novato03 Conexión con bases de datos 7 02-10-2007 23:49:02
Agregar Campo en Tabla Access MaMu Conexión con bases de datos 2 25-05-2007 19:35:15
Modificar campo tabla access desde delphi JuanHC Conexión con bases de datos 3 25-09-2006 13:15:02
Modificar campo de tabla en MS ACCESS i_minex Servers 1 04-03-2005 09:05:15


La franja horaria es GMT +2. Ahora son las 16:43:09.


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
Copyright 1996-2007 Club Delphi