Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Guardar y recuperar imágenes de BD en C++ builder (https://www.clubdelphi.com/foros/showthread.php?t=84557)

Renegoras 03-11-2013 20:56:48

Guardar y recuperar imágenes de BD en C++ builder
 
Amigos del foro: Un saludo y agradecimiento muy fraternal a todos ustedes, por la colaboración que brindan.

Espero no redundar con este tema ya que hay varios hilos respecto a esto, sin embargo la mayoría por obviedad están enfocados a Delphi y me es algo complicado transportar el código a c++ builder, ya que siempre existe o esta presente algún error.

Mi duda concreta-mente hace referencia a como guardar una imagen desde un Form a una Base de Datos que tenga un campo blob y de igual forma recuperar y poder mostrar esta imagen en C++ Builder.

También si se podría, mostrarme mediante código como guardar la imagen como tal en la Base de Datos, como guardar solamente la dirección de referencia de la imagen almacenada en un Disco duro y como poder recuperar dicha imagen.

Trabajo con MySQL, conexion ODBC, formato de imágenes jpg y C++Builder 2010.

PD: He logrado guardar las imágenes en la BD directamente desde el editor de PhpMyAdmin y parcialmente he logrado ver esas imágenes desde un form......lo que no logro es recuperar la imagen cuando esta almacenada la dirección de esta en la BD.

De antemano muchas gracias a todos.................

ecfisa 03-11-2013 22:01:59

Hola Renegoras.

Cita:

Empezado por Renegoras (Mensaje 469260)
Mi duda concreta-mente hace referencia a como guardar una imagen desde un Form a una Base de Datos que tenga un campo blob y de igual forma recuperar y poder mostrar esta imagen en C++ Builder.

Código:

...
#include <jpeg.hpp>

// TImage a campo BLOB
void __fastcall ImageToField(TImage *aImage, TField *aField)
{
  if (aImage->Picture->Graphic->ClassNameIs("TJPEGImage")) {
    aField->DataSet->Edit();
    aField->Assign(aImage->Picture->Graphic);
  }
}

// Campo BLOB a TImage
void __fastcall FieldToImage(TField *aField, TImage *aImage)
{
  TJPEGImage *JPG = new TJPEGImage;

  if (aField->ClassNameIs("TBlobField")) {
    JPG->Assign(aField);
    aImage->Picture = NULL;
    aImage->Picture->Assign(JPG);
  }
  delete JPG;
}

Ejemplos de llamada:
Código:

// Guardar
void __fastcall TForm1::btSaveClick(TObject *Sender)
{
  DataSet->Edit();
  ImageToField(Image1, DataSet->FieldByName("IMAGEN"));
  DataSet->Post();
}

// Mostrar en TImage
void __fastcall TForm1::btMuestraClick(TObject *Sender)
{
 FieldToImage(DataSet->FieldByName("IMAGEN"), Image2);
}

Saludos :)

Renegoras 05-11-2013 01:51:19

Funciona
 
Gracias por la respuesta amigo ecfisa.
Logre implementar el codigo y puedo llamar la imagen de manera correcta:

DataSource1->DataSet->Active=False;
Buscar_Usuario->Close();
Buscar_Usuario->Params->Items[0]->Value=Edit1->Text;
Buscar_Usuario->Open();
if(Buscar_Usuario->RecordCount !=0)
{
DataSource1->DataSet->Active=True;
FieldToImage(DataSource1->DataSet->FieldByName("fotos"), Image1);

}
else

{
ShowMessage("No existe el registro");

}


Sin embargo debo molestarte con una duda mas, puesto que quisiera ingresar la imagen junto con un nombre y algún otro dato mas (CI, Email, etc)...........no he logrado hacer eso, puesto que con:

DataSource2->DataSet->Edit();
ImageToField(Image1, DataSource2->DataSet->FieldByName("fotos"));
DataSource2->DataSet->Post();

solo he logrado que el programa corra apuntado el DataSource a la Tabla, pero solo modifica la imagen del primer registro

He tratado de utilizar un Query con una consulta SQL(insert into fotos (nombre,fotos) values(:nombre,:fotos)).....pero no logro enlazar esta consulta con el código que me proporcionarte de manera que guarde los datos junto con la imagen.

PD: He logrado mostrar la Imagen cuando está esta en la base de datos y no así cuando solo está la dirección....me sale un error #53 jpg..algo asi.

Espero no molestarte mucho con estas preguntas.................Muchas gracias

ecfisa 05-11-2013 16:11:11

Cita:

Empezado por Renegoras (Mensaje 469308)
...
Sin embargo debo molestarte con una duda mas, puesto que quisiera ingresar la imagen junto con un nombre y algún otro dato mas (CI, Email, etc)...........no he logrado hacer eso, puesto que con:

DataSource2->DataSet->Edit();
ImageToField(Image1, DataSource2->DataSet->FieldByName("fotos"));
DataSource2->DataSet->Post();

Hola Renegoras.

Para agregar los valores a los campos:
Código:

...
    DataSource2->DataSet->Insert();  // Agregar
    DataSource2->DataSet->FieldByName("CI")->Value    = variableCI;
    DataSource2->DataSet->FieldByName("Email")->Value = variableEmail;
    FieldToImage(DataSource2->DataSet->FieldByName("fotos"), Image1);
    DataSource2->DataSet->Post();
...

En cuanto al error #53, en general se debe a un archivo de imagen no válido, revisa estos enlaces: Por último cuando agregues código C++, por favor encerralo entre las etiquetas [code] aquí_tu_codigo [/code] para que sea mas legible.

Saludos :)

Renegoras 06-11-2013 04:49:25

Gracias ................
 
Muchas gracias "ecfisa", funciono perfectamente, tomare en cuenta tus recomendaciones para la siguiente..........................un saludo fraternal.


La franja horaria es GMT +2. Ahora son las 11:17:09.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi