Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Cargar un TImage desde Firebird

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Cargar un TImage desde Firebird Responder citando

Tengo definida una tabla en Firebird con un campo para guardar un gráfico definido así:
Código:
CARATULA BLOB SUB_TYPE 0 SEGMENT SIZE 240

Bien. La carga, hecha a partir de una tabla Paradox, está perfectamente realizada. Tengo una duda: ¿Cómo hago para asignar ahora el contenido de ese campo CARATULA a, por ejemplo, un TImage o un TQRImage?
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Pudes usar la siguiente función, creo que la he puesto en Tips & Trucos, pero por si las dudas, no la encuentras, te la paso, el chiste es grabar la imagen almacenada en un BLOB y transferirla a un stream posteriormente usando la libreria TJPG la puedes assignar a un TImage

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);
}


La manera de usarse seria de la siguiente forma:
Código:
this->Image1->Picture->Assign(::BLOBtoJPG(::TuTablaCARATULA))


Saludos
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Gracias por la respuesta César. Es verdad que estaba en la sección de trucos y no la vi; perdón por repetir la pregunta.

Me asalta una duda sobre como usar la función. La definición de la función no da ningún problema; otra cosa es usarla. No acabo de entender como llamar a la función:
Código:
this->Image1->Picture->Assign(::BLOBtoJPG(::TuTablaCARATULA))

¿Cómo llevo yo a la función el contenido del campo? La tabla se llama Titulos. Si pongo:
Código:
Image->Picture->Assign(::BLOBtoJPG(Titulos->FieldByName("CARATULA")))

me da este error al compilar:
Cita:
E2034 Cannot convert 'TField *' to 'TBlobField *'

Mientras que si pongo
Código:
Image->Picture->Assign(::BLOBtoJPG(::Titulos->FieldByName("CARATULA")))
el error es:
Cita:
E2451 Undefined symbol 'Titulos'

Y si pongo
Código:
Image->Picture->Assign(::BLOBtoJPG(Titulos->FieldByName(Titulos->FieldDefs->Items[nItem]->Name)->Value);
entonces el error es
Cita:
E2034 Cannot convert 'Variant' to 'TBlobField *'

_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Código:
this->Image1->Picture->Assign(::BLOBtoJPG(TitulosCARATULA));


donde en la tabla titulos has presionado doble clic y has agregado los campos que pertenecen a la tabla
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

¡Chico! ¡Eres un monstruo! Pero ahora tengo otro problema Embarassed Ha quedado así:
Código:
Image->Picture->Assign(::BLOBtoJPG(TitulosCARATULA));

Ahora tengo otro probelma: Cuando en la función ejecuta la línea
Código:
JPeg->LoadFromStream(StreamTmp)
da un JPEG error #52. Lo he solucionado extrayendolo en forma de Bitmap. No sé si será la forma correcta o no, pero me funciona. La función ha quedado así:
Código:
Graphics::TBitmap* __fastcall TfTitulos::BLOBtoJPG(TBlobField *CampoBLOB)
{
     Graphics::TBitmap *Bitmap = new Graphics::TBitmap();
     TMemoryStream *StreamTmp = new TMemoryStream;

     CampoBLOB->SaveToStream(StreamTmp);
     StreamTmp->Seek(0, soFromBeginning);
     if (StreamTmp->Size > 1)
          Bitmap->LoadFromStream(StreamTmp);
     return(Bitmap);
}
//---------------------------------------------------------------------------

_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

No creo que tengas ningun inconveniente, al parecer debes agregar las cabeceras para el tratamiento de JPEG la cual es:
Código:
#include <jpeg>


creo que hay problemas en cuanto a los codigos del foro, no se muestran correctamente la información dentro del foro.
debe ser el archivo de cabecera jpeg.cpp, pero no se muestra en la pantalla

#include <jpeg>

aun que la conversion la hice, para no jalar mucha memoria cuando la imagen al macenada (que tambien esta en formato JPEG) es demasiado grande, si se convierte en formato BMP esta ocupa mucho espacio y en el TImage tarda un poco mas en mostrarse.

en si las dos funciones para: tanto para almacenar en formato JPEG y recuperar las imagenes, estan en Tips & Trucos,

si te das cuenta en la parte de tips & trucos, al meter una imagen esta se convierte en formato JPEG, para que no ocupe mucho espacio en la base de datos.

saludos.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Gracias César. Lo del include se me había olvidado. Lo probaré el lunes porque el programa no lo tengo en casa.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.