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 

Insertar imagen en Firebird

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Insertar imagen en Firebird Responder citando

He estado viendo el código que ha puesto César en Blob y JPG en base de datos y no he logrado que funcione pero porque no entiendo muy bien la forma de usar la rutina.

Tengo definido un campo Foto en una Tabla en un CREATE TABLE como Foto BLOB SUB_TYPE 0 SEGMENT SIZE 240. ¿Cómo tendría que escribir la instrucción
Código:
TuBase->TuTablFoto->LoadFromStream(::ImagenToStream(this->OpenPictureDialog1->FileName));

para que funcionara bien? Tal cual está, el compilador dice que LoadFromFile no es parte de TField. La instruciion la he escrito así:
Código:
Personas->FieldByName("Foto")->LoadFromStream(::ImagenToStream(this->OpenPictureDialog1->FileName));

_________________
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

Hola Ángel, hace poco que estuve con este tema teninedo quebraderos de cabeza jeje, bueno mira te pongo mi código, se trata de guardar una imagen en la bd sobre unas máquinas:
Código:

if(frmNuevaMaq->dlgImg->FileName != "")   
  static_cast<TBlobField>(frmMaquinas->dataMaquinas->FieldByName("Maq_foto"))->LoadFromStream(ImagenToStream(dlgImg->FileName));


donde dlgImg es el componente de dialogo para abrir la imagen, dataMaquinas es el IBDataSet donde guardo las máquinas e ImagenToStream es la función que colgó César.

Luego cuando quiero ver los detalles de una máquina, para recuperar la imagen hago lo siguiente:

Código:

(...)
//A continuación, este código sirve para "convertir" de Blob (binario) a jpeg y mostrarlo en el TImage
    if(frmMaquinas->dataMaquinas->FieldByName("Maq_foto")->AsString != "") //si no tiene foto, no se hace nada
    {
      TJPEGImage *JPeg;

      JPeg = BlobToJpg(static_cast <TBlobField>(frmMaquinas->dataMaquinas->FieldByName("Maq_foto")));
      frmNuevaMaq->imgMaquina->Picture->Assign(JPeg);
    }
//Fin
(...)


Donde BlobToJpg es la otra función que puso César

Espero que te sirva de ayuda Wink

saludos!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Bueno, me está dando algún problema al compilar la función para cargar en un TImage. Me dice, literalmente, [C++ Error] Socio.cpp(92): E2034 Cannot convert 'TJPEGImage *' to 'TJPEGImage'. La línea a la que hace referencia es el return:
Código:
TJPEGImage __fastcall TfSocio::BlobToJpg(TBlobField *CampoBLOB)
{
     TJPEGImage *JPeg = new TJPEGImage();
     TMemoryStream *StreamTmp = new TMemoryStream();

     if (!CampoBLOB->Value.IsEmpty())
     {
          CampoBLOB->SaveToStream(StreamTmp); //sacamos el jpg y se convierte a stream
          StreamTmp->Seek(0, soFromBeginning);
          JPeg->LoadFromStream(StreamTmp);
          return(JPeg);
     }
     else
          return(NULL);
}

Seguiré probando y ya diré como ha ido todo.
_________________
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

El fallo creo que esta en el prototipo de la función, devuelves un TJPEGImage, cuadno debería de devolver un TJPEGImage *, de hecho viendo tu función debería de devolver un TJPEGImage *, cambialo y creo que te funcionará sin problemas Wink

saludos!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Pues no logro que me grabe ninguna imagen. El código que tengo es este:
    1. Para grabar
    Código:
    void __fastcall TfSocio::AddFotoClick(TObject *Sender)
    {
         if (Fotos->Execute())
         {
              Socios->Edit();
              static_cast<TBlobField>(Socios->FieldByName("Foto"))->LoadFromStream(ImagenToStream(Fotos->FileName));
              Socios->Post();
         }
    }
    //---------------------------------------------------------------------------

    TMemoryStream * __fastcall TfSocio::ImagenToStream(AnsiString cImagen)
    {
         TJPEGImage *jpg = new TJPEGImage();
         TMemoryStream *StreamTmp = new TMemoryStream;
         AnsiString Ext = ExtractFileExt(cImagen);
         
         if (UpperCase(Ext.Trim()) == ".GIF" ||   // GIF
             UpperCase(Ext.Trim()) == ".WMF" ||   // wmf
             UpperCase(Ext.Trim()) == ".EMF" ||   // emf
             UpperCase(Ext.Trim()) == ".ICO" ||   // ICO
             UpperCase(Ext.Trim()) == ".BMP" ||   // bmp
             UpperCase(Ext.Trim()) == ".JPG" ||   // jpg
             UpperCase(Ext.Trim()) == ".JPEG")    // jpeg
         {
              const int HIMETRIC_INCH   = 2540;
              TImage *imagen = new TImage(NULL);
              IPicture *pPicture = NULL;
              OleLoadPicturePath( StringToOleStr(cImagen), NULL, 0, 0, IID_IPicture, (void**)&pPicture);

              if (pPicture)  // Carga la imagen en el TImage temporal
              {
                   imagen->Picture = NULL;
                   long ancho, alto;
                   pPicture->get_Width(&ancho);
                   pPicture->get_Height(&alto);
                   imagen->Picture->Bitmap->Width = MulDiv(ancho, GetDeviceCaps(imagen->Canvas->Handle, LOGPIXELSX), HIMETRIC_INCH);
                   imagen->Picture->Bitmap->Height = MulDiv(alto, GetDeviceCaps(imagen->Canvas->Handle, LOGPIXELSY), HIMETRIC_INCH);
                   RECT rect = imagen->ClientRect;
                   pPicture->Render(imagen->Canvas->Handle, 0, 0, imagen->Picture->Bitmap->Width, imagen->Picture->Bitmap->Height, 0, alto, ancho, -alto, &rect);
                   pPicture->Release();
                   jpg->Assign(imagen->Picture->Bitmap);
                   jpg->SaveToStream(StreamTmp);
              }
         }
         return(StreamTmp);
    }
    //---------------------------------------------------------------------------

    2. Para leer
    Código:
    if (Query->FieldByName("Foto")->AsString != "") //si no tiene foto, no se hace nada
    {
         TJPEGImage *JPeg;

         JPeg = BlobToJpg(static_cast <TBlobField>(Query->FieldByName(Query->FieldDefs->Items[nItem]->Name)));
         Imagen->Picture->Assign(JPeg);
    }
    //---------------------------------------------------------------------------

    TJPEGImage* __fastcall TfSocio::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);
    }
    //---------------------------------------------------------------------------

No me da ningún error de compilación ni nada, pero no graba nada. Y está comprobado que al salir de la función ImagenToStream, StreamTmp no está vacío. Según el debug del programa, en la prueba que he hecho me da estos datos:
    FCapacity > 8192 (0x00002000)
    FMemory > :001B8F18
    FSize > 6487 (0x00001957)
    FPosition > 6487 (0x00001957)

por lo que supongo que la imagen sí se ha cargado en memoria.
_________________
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

wenas, yo una vez para una aplicacion inserte imagenes en una base de de datos, en mi caso era interbase, pero quizas te sirva de algo, aqui te lo pongo.

yo añadi la libreria #include <jpeg> en la cabecera.

insercion : (pathi es un edit que contiene la direcion absoluta de la imagen)

Código:

IBQuery2->SQL->Clear();
       IBQuery2->SQL->Add("Update trabajos SET imagen=:imagen  WHERE id_cliente='"+ IntToStr(id_cli) +"' AND numero='"+ IntToStr(max) +"';");
       TJPEGImage *jpg = new TJPEGImage();
       TMemoryStream *msImagen = new TMemoryStream;
       // cargo el archivo..
       jpg->LoadFromFile(pathi->Text);
       jpg->SaveToStream(msImagen);
       msImagen->Seek(0,soFromBeginning);
       IBQuery2->ParamByName("imagen")->LoadFromStream(msImagen,ftBlob);
       IBQuery2->ExecSQL();
       delete jpg;
       delete msImagen;


y para sacar la imagen de la base de datos :
Código:

IBQuery2->SQL->Clear();
   IBQuery2->SQL->Add("SELECT c.id as id,t.imagen as imagen FROM  trabajos t INNER JOIN clientes c ON (c.id=t.id_cliente) WHERE c.nombre='"+ nome->Text+"' AND t.numero='"+IntToStr(numero)+"';");
   IBQuery2->Prepare();
   IBQuery2->Open();
   IBQuery2->First();
   id_cli=(IBQuery2->FieldByName("id")->AsInteger);
   String imagen= (IBQuery2->FieldByName("imagen")->AsString);
   if(imagen!="")
   {
   TJPEGImage *jpg = new TJPEGImage();
   TMemoryStream *stream  = new TMemoryStream();
   IBQuery2->Open();
  ((TBlobField*)IBQuery2->FieldByName("imagen"))->SaveToStream(stream);
   stream->Seek(0,soFromBeginning);
   jpg->LoadFromStream(stream);
   Image2->Picture->Assign(jpg);
   delete jpg;
   delete stream;
   check->State=cbUnchecked;
   Button2->Enabled=true;
   }
   else
   {
    Image2->Picture->Bitmap->Empty;
    check->State=cbChecked;
   }



a ver si te puede servir de ayuda.

un saludo!!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¡¡¡Perfecto!!! Sólo me ha dado un error en una línea: Image2->Picture->Bitmap->Empty; Lo he cambiado por Imagen->PIcture->Assign(NULL).

Muchas gracias rivo, y disfruta del Sella
_________________
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

de nada!!, lo disfrutare, jajaja Laughing
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola a todos.

Estoy intentando meter en la base de datos una imagen, estoy utilizando la solucion que puso rivo en este post pero no me funciona, el primer error que me da esque no me reconoce la libreria jpeg, no se de donde conseguirla, otra duda que tengo esque no se a la hora de crear la tabla donde meto el campo de la imgen de que tipo tengo que declararla.

Utilizo mysql 5.0 y mysqldac.

El codigo que pongo para guardar la imagen es el siguiente:

Código:

AnsiString CurrentFile;
    CurrentFile = OpenPictureDialog1->FileName;
    Image1->Picture->LoadFromFile(CurrentFile);
    String imgrta=CurrentFile;
       Form1->Query1->SQL->Clear();
       Form1->Query1->SQL->Add("Update datos SET imagen=:imagen  WHERE nombre='"+Form10->nombre->Text+"';");
       TJPEGImage *jpg = new TJPEGImage();
       TMemoryStream *msImagen = new TMemoryStream;
       jpg->LoadFromFile(imgrta);
       jpg->SaveToStream(msImagen);
       msImagen->Seek(0,soFromBeginning);
       Form1->Query1->ParamByName("imagen")->LoadFromStream(msImagen,ftBlob);
       Form1->Query1->ExecSQL();
       delete jpg;
       delete msImagen;}

Como veis es practicamente lo mismo que puso rivo como solucion pero no le hago funcionar. cuando ejecuto me da el siguiente error:

"raised exception class EJPEG with message 'JPEG error #52', Process stopped..."

Como veis se nota a lo lejos mi inexperiencia en el tema...

¿Alquien sabe como puedo hacerle funcionar?

Gracias de antemano y saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Saludos Angel realmente no habia visto el post. te paso las funciones que uso para el tratamiento de las imagenes y me ha funcionado sin ningun problema

Recuerda usar los archivos de Cabecera correspondiente para que funcione el JPG
Cita:
#include <jpeg.hpp> // para los jpg
#include <memory> // para el auto_ptr



Código:
//----------------------------------------------------------------
// CARGA UNA IMAGEN Y REGRESA UN STREAM tipo JPG
TMemoryStream * __fastcall FileImagenToStreamJPG(AnsiString Nombre_y_Ruta)
{
   TJPEGImage          *jpg = new TJPEGImage();
   TMemoryStream *StreamTmp = new TMemoryStream;
   AnsiString Ext = ExtractFileExt(Nombre_y_Ruta);
   if(UpperCase(Ext.Trim()) == ".GIF" ||  //imagen GIF
      UpperCase(Ext.Trim()) == ".WMF" ||  // wmf
      UpperCase(Ext.Trim()) == ".EMF" || // emf
      UpperCase(Ext.Trim()) == ".ICO" || // ICO
      UpperCase(Ext.Trim()) == ".BMP" || //bmp
      UpperCase(Ext.Trim()) == ".JPG" || // jpg
      UpperCase(Ext.Trim()) == ".JPEG"   // jpeg
      //UpperCase(Ext.Trim()) == ".PNG"  //  jeje aun no puedo
      )
   {
      TImage *imagen = new TImage(NULL);
      const int HIMETRIC_INCH   = 2540;
      IPicture *pPicture = NULL;
      OleLoadPicturePath( StringToOleStr(Nombre_y_Ruta), NULL, 0, 0, IID_IPicture, (void**)&pPicture);
      // Carga la imagen en el TImage temporal
      if (pPicture)
      {
         imagen->Picture = NULL;
         long ancho, alto;
         pPicture->get_Width(&ancho);
         pPicture->get_Height(&alto);
         imagen->Picture->Bitmap->Width = MulDiv(ancho,GetDeviceCaps(imagen->Canvas->Handle, LOGPIXELSX), HIMETRIC_INCH);
         imagen->Picture->Bitmap->Height = MulDiv(alto,GetDeviceCaps(imagen->Canvas->Handle, LOGPIXELSY), HIMETRIC_INCH);
         RECT rect = imagen->ClientRect;
         pPicture->Render(imagen->Canvas->Handle, 0, 0,imagen->Picture->Bitmap->Width, imagen->Picture->Bitmap->Height,0, alto, ancho, -alto, &rect);
         pPicture->Release();
         jpg->Assign(imagen->Picture->Bitmap);
         jpg->SaveToStream(StreamTmp);
      }
      delete imagen;
   }
   delete jpg;
   return(StreamTmp);
}
//-----------------------------------------------------------------
// funcion que extrae una imagen contenida en un blob y la convierte a jpg
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);
}
//-----------------------------------------------------------------


y la manera de usarse

Para meter la imagen convertida en jpg en el campo blob
Código:
TuModuloDatos->TuTablaCAMPO_BLOB->LoadFromStream(::FileImagenToStreamJPG(this->OpenPictureDialog1->FileName));


para sacar la imagen y ponerlo en un TImage
Código:
this->Image1->Picture->Assign(::BLOBtoJPG(TuModuloDatos->TuTablaCAMPO_BLOB));


y comentarte que mi campo BLOB lo declaro asi en la base de datos
tipo: BLOB
Segment Size: 80
Subtype: 0

y he cargado dentro de él imagenes de 2 escritoros pegadas sin ningún problema, saludos.
_________________
Cool


Ultima edición por Cesar C. Salazar Gonzalez el Lun 17 Sep, 2007 12:02 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

César C. Salazar González escribió:
Saludos Angel realmente no habia visto el post. te paso las funciones que uso para el tratamiento de las imagenes y me ha funcionado sin ningun problema

Hoal César, pero no era mio el post. Esas funciones, que ya me las pasaste, me funcionan perfectamente Smile
_________________
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.