Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-10-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cargar imagen desde Firebird

Estoy usando este código que me facilitaron en otro foro:
Código:
TJPEGImage*  __fastcall BlobToJpg(TBlobField *CampoBLOB) 
{ 
    if(!CampoBLOB->Value.IsEmpty()) 
    { 
        TJPEGImage *JPeg = new TJPEGImage; 
        TMemoryStream *StreamTmp = new TMemoryStream; 
        CampoBLOB->SaveToStream(StreamTmp); //sacamos el jpg y se convierte a stream 
        StreamTmp->Seek(0,soFromBeginning); 
        JPeg->LoadFromStream(StreamTmp); 
        return(JPeg); 
    } 
    else 
        return(NULL); 
}
para poder sacar imágenes desde una tabla Firebird. Siguiendo las instrucciones del autor trato de cargar la misma en un objeto TImage de la siguiente forma a partir de un query:
Código:
Imagen->Picture->Assign(::BLOBtoJPG(Query->FieldByName("Imagen")));
pero tanto con esta sintaxis como de esta otra forma:
Código:
Imagen->Picture->Assign(::BLOBtoJPG(Query->FieldByName("Imagen")->Value));
En ambos casos me da error al compilar; en el primer caso me dice:
Cita:
E2034 Cannot convert 'TField *' to 'TBlobField *'
y en el segundo algo parecido:
Cita:
E2034 Cannot convert 'Variant' to 'TBlobField *'
¿Alguna idea para resolver el problema?
Responder Con Cita
  #2  
Antiguo 11-10-2017
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 16
TOPX Va camino a la fama
Si fuera yo, definiría el tipo del parámetro CampoBLOB como TField, de manera que no tenga que preocuparme por el code smell del casteo.
-
__________________
"constructive mind, destructive thoughts"
Responder Con Cita
  #3  
Antiguo 11-10-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Haré la prueba.
Responder Con Cita
  #4  
Antiguo 11-10-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por TOPX Ver Mensaje
Si fuera yo, definiría el tipo del parámetro CampoBLOB como TField, de manera que no tenga que preocuparme por el code smell del casteo.
No funciona. Y al compliar me he dado cuenta de por qué: Fíjate que en la función hay un SaveToStream que si se usa en la definición un TField en lugar de un TBlobField da error.
Cita:
E2316 'SaveToStream' is not a member of 'TField'
Responder Con Cita
  #5  
Antiguo 11-10-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Dicho de otra forma: ¿Qué habría que poner detrás del FieldByName? Igual que ponemos AsString, AsInteger o AsDateTime, ¿qué se pone en caso de campos BLOB? Porque AsBlob a mi me da error en BCB 6.
Responder Con Cita
  #6  
Antiguo 11-10-2017
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 16
TOPX Va camino a la fama
Cita:
Empezado por Angel.Matilla Ver Mensaje
No funciona. Y al compliar me he dado cuenta de por qué: Fíjate que en la función hay un SaveToStream que si se usa en la definición un TField en lugar de un TBlobField da error.
Ok, entonces hay que hacer el casteo al tipo de dato del parámetro, osea algo como
Código:
::BLOBtoJPG((TBlobField*)Query->FieldByName("Imagen"))
Cita:
Empezado por Angel.Matilla Ver Mensaje
Igual que ponemos AsString, AsInteger o AsDateTime, ¿qué se pone en caso de campos BLOB? Porque AsBlob a mi me da error en BCB 6.
Eso es equivocado; el método BLOBtoJPG no está pidiendo un valor, está pidiendo un objeto.
-
__________________
"constructive mind, destructive thoughts"
Responder Con Cita
  #7  
Antiguo 12-10-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Solo como observación, me parece ver un problema de memory leak en esa función...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo 12-10-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola de nuevo.

De este modo me funciona bien:
Código PHP:
...
#include <jpeg.hpp>

void blobTojpgTField *fldTImage *img )
{
  
TBlobField *static_cast <TBlobField*> ( fld );

  if( !
B->Value.IsEmpty() ) {
    
TJPEGImage *= new TJPEGImage;
    try {
      
J->Assign);
      
img->Picture->Bitmap->Height J->Height;
      
img->Picture->Bitmap->Width  J->Width;
      
img->Picture->Bitmap->Canvas->Draw00);
    }
    
__finally {
      
delete J;
    }
  }


Y si gustas usar streams,
Código PHP:
void blobTojpg2TField *fldTImage *img )
{
  
TBlobField *static_cast <TBlobField*> ( fld );

  if ( !
B->Value.IsEmpty() ) {
    
TStream *Stream = new TMemoryStream;
    
TJPEGImage *Jpg = new TJPEGImage;
    try {
     
B->SaveToStreamStream );
     
Stream->Seek0soFromBeginning);
     
Jpg->LoadFromStreamStream );
     
img->Picture->AssignJpg );
    }
    
__finally {
      
delete Stream;
      
delete Jpg;
    }
  }

Llamada (para ambos casos):
Código PHP:
void __fastcall TForm1::DataSetAfterScrollTDataSet *DataSet )
{
   
blobTojpgIBDataSet1->FieldByName("IMAGE"), Image1 ); // o blobToJpg2( ...

El resultado en ambos casos:


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 13-10-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por TOPX Ver Mensaje
Ok, entonces hay que hacer el casteo al tipo de dato del parámetro, osea algo como
Código:
::BLOBtoJPG((TBlobField*)Query->FieldByName("Imagen"))
¿Ves? Estas cosas no se me ocurren nunca . Ha funcionado a la perfección.
Cita:
Empezado por TOPX Ver Mensaje
Eso es equivocado; el método BLOBtoJPG no está pidiendo un valor, está pidiendo un objeto.
Ya, pero si se puede usar como parámetro (Query->ParamByName("Imagen")->AsBlob), alguna forma tiene que haber para llamar a ese objeto desde un FieldByName.
Cita:
Empezado por ecfisa Ver Mensaje
Solo como observación, me parece ver un problema de memory leak en esa función...
¿Dónde? A mi no me da ningún error de memoria.
Responder Con Cita
  #10  
Antiguo 13-10-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por Angel.Matilla Ver Mensaje
¿Dónde? A mi no me da ningún error de memoria.
Código:
TJPEGImage*  __fastcall BlobToJpg(TBlobField *CampoBLOB)
{
    if(!CampoBLOB->Value.IsEmpty())
    {
        TJPEGImage *JPeg = new TJPEGImage;             // <==== (1)
        TMemoryStream *StreamTmp = new TMemoryStream;  // <==== (2)
        CampoBLOB->SaveToStream(StreamTmp); //sacamos el jpg y se convierte a stream
        StreamTmp->Seek(0,soFromBeginning);
        JPeg->LoadFromStream(StreamTmp);
        return(JPeg);
    }
    else
        return(NULL);
}
Tal vez no todavia...

Cuando solicitas recursos usando VCL es tu responsabilidad liberarlos, Builder C++ no liberará automáticamente la memoria ocupada, aún cuando se trate de variables locales a la función.

En ese código no se libera la variable SteramTmp; y lo mas serio es que no se puede liberar la variable JPeg sin dejar inoperante la función.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #11  
Antiguo 14-10-2017
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 16
TOPX Va camino a la fama
Cita:
Empezado por ecfisa Ver Mensaje
Cuando solicitas recursos usando VCL es tu responsabilidad liberarlos, Builder C++ no liberará automáticamente la memoria ocupada, aún cuando se trate de variables locales a la función.
Es muy importante esto que dice ecfisa, hay que aplicar esa directriz siempre.

Verguenza para mí que no lo había pillado en el código inicial.
-
__________________
"constructive mind, destructive thoughts"
Responder Con Cita
  #12  
Antiguo 14-10-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
¡Pues no me había dado cuenta! Tenéis razón. El problema es cómo liberar ambas variables ya que el jpeg es lo que devuelve como respuesta la función; no se me ocurre como. Acaso sea mejor sistema el que me sugieres en tu código, invocando en la función tanto el campo blob como el TImage en que ha de situarse; de esa forma se pueden liberar recursos. Voy a probarlo.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Cargar Imagen desde un Hosting b3nshi Internet 2 05-02-2010 20:13:29
Cargar imagen desde directorio domenor Gráficos 13 16-10-2007 17:54:30
Cargar Imagen desde un Form secundario Bicholoco Gráficos 11 02-04-2007 18:11:51
Cargar una imagen desde la web a un TImage asegura Gráficos 3 20-10-2006 03:13:10
Cargar una imagen desde sitio en internet?? burasu Internet 10 01-09-2004 14:05:49


La franja horaria es GMT +2. Ahora son las 21:02:16.


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