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 

Guardar una foto en una BD

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Guardar una foto en una BD Responder citando

hola amigos, lo otro que estoy tratando de hacer es guardar una foto... lo intento guardar en un campo blob pero se me cae cuando se hace la insersion en la BD... alguien sabe al respecto Smile... espero que me ayuden... seria muy genial
Volver arriba
Mensaje    Asunto: Responder citando

Que formato de imagen intentas cargar? TDBImage no soporta todos los formatos si intentas guardar imagenes jpg te falla no la insercion pues esta llega a ocurrir, sino la presentacion.

Para este caso hay que realizar a mano la presentacion en un Timage normal extrayendo del blob a un stream y de este al TImage, esto coordinado con el cambio de registro en el DataSet.

Hay un ejemplo en el libro de Ian Marteens acerca de esto, una idea que se me ocurre es la de cambiar el formato al momento de cargar por uno compatible, me parece haber visto algo asi en este foro..
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Tienes que convertirlo en stream (par que sea compatible conel campo blob) y ademas debe ser leido desde un campo persistente..(hasta ahora es lo que encontre)
_________________
Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc

http://www.touchsoftwares.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Saludos, creo que ya habia respondido a una rpegunta asi, pero por si no, aqui va de nuevo, el codigo esta el Delphi pero no te costara mucho pasarlo aa C++Builder:

Código:

//Esta funcion lo que hace es convertir el Bitmap a JPG para que ocupe menos espacio en tu DB y lo manda a un stream
function BitmapAStream(bmpImagen:TBitmap):TMemoryStream;
  var
    msImagen:TMemoryStream;
    jpgImagen:TJPEGImage;
begin
   msImagen:=TMemoryStream.Create();
   jpgImagen:=TJPEGImage.Create();
   jpgImagen.Assign(bmpImagen);
   jpgImagen.SaveToStream(msImagen);
   msImagen.Seek(0,soFromBeginning);
   jpgImagen.Free();
   result:=msImagen;
end;

//y asi se utilizaria...
             msFoto:=BitmapAStream(imgFoto.Picture.Bitmap);
             Query.ParamByName('pFoto').LoadFromStream(msFoto,ftBlob);
             msFoto.Free();
             Query.ExecSQL();


Cabe mencionar que en el Query puse la instruccion de insercion en la BD, el campo es de Tipo Image, esta en SQL Server... tambien te recuerdo que como la imagen la guardaste como jpg.. a la hora de mostrarla vas a tener que convertirla de nuevo a bmp... Cualquier duda estoy para servirte
_________________
Dirección Municipal de Informática
H. Ayuntamiento de Tijuana
Arriba Lopez Obrador !!!
Los Mexicanos Merecemos Respeto !!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Seria mucho pedir que el codigo este en c++ builder?,

(el foro es de c++ no delphi)

Disculpa si parezco : "Limosnero y con garrote"

Un saludo Laughing
_________________
Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc

http://www.touchsoftwares.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

A la orden patrón :p

Código:


//Esta funcion lo que hace es convertir el Bitmap a JPG para que ocupe menos espacio en tu DB y lo manda a un stream
TMemoryStream BitmapAStream(TBitmap *bmpImagen)
{
    TMemoryStream *msImagen = new TMemoryStream;
    TJPEGImage *jpgImagen = new TJPEGImage;


   jpgImagen->Assign(bmpImagen);
   jpgImagen->SaveToStream(msImagen);
   msImagen->Seek(0,soFromBeginning);
   delete jpgImagen;
   return msImagen;
}

//y asi se utilizaria...
             msFoto=BitmapAStream(imgFoto->Picture->Bitmap);
             Query->ParamByName("pFoto")->LoadFromStream(msFoto,ftBlob);
             delete msFoto;
             Query->ExecSQL();



Servido Señores
_________________
Dirección Municipal de Informática
H. Ayuntamiento de Tijuana
Arriba Lopez Obrador !!!
Los Mexicanos Merecemos Respeto !!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Primero que nada gracias a lord nemesis por su ayuda y a todos.

Recomiendo NO tener la columna imagen dentro de tablas recurrentes, ya que las consultas y tablas quedan muy lentas.

Tomando en cuenta en mi aplicacion por dia se toman 50 fotos o mas

Uso MySQL ver 4.1

La opcion a la que llegue es usar una tabla llamada "imagenes" donde guardo todas las imagenes tomadas

campos de la misma:

id (autonimerico), folio_referencia (int), imagen (long blob), tipo (varchar (1) indica de donde proviene ejemplo: P=produccion, V=ventas, E=empleado etc etc

De esta forma queda acelerado (normal) el funcionamiento

Ojo con el puntero <-------------------------- TMemoryStream *Bitmap
Código:

TMemoryStream *BitmapAStream(Graphics::TBitmap *bmpImagen)
{
   TMemoryStream *msImagen = new TMemoryStream;
   TJPEGImage *jpgImagen = new TJPEGImage;
   jpgImagen->Assign(bmpImagen);
   jpgImagen->SaveToStream(msImagen);
   msImagen->Seek(0,soFromBeginning);
   delete jpgImagen;
   return msImagen;
}

y quedaria asi (ya lo probe en c++ builder).. GRACIAS A LORD!!! por ayudarnos

Código:

TMemoryStream *msFoto = new TMemoryStream;
msFoto=BitmapAStream(imgVideo->Picture->Bitmap);
qryImagenes->Close();
qryImagenes->Params->Items[0]->AsInteger =dmDefiniciones->qryProduccion->FieldByName("folio_produccion")->AsInteger;
qryImagenes->Params->Items[1]->AsString = "P";
qryImagenes->ParamByName("vImagen")->LoadFromStream( msFoto,ftBlob) ;
delete msFoto;
qryImagenes->ExecSQL();
qryImagenes->Close();

_________________
Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc

http://www.touchsoftwares.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Hola Touchsoftwares.... no hay de que, para eso estamos para ayudarnos... nada mas, si me lo permite,s te hago una observacion en el codigo que pusiste....

en la funcion:
Código:
TMemoryStream *BitmapAStream(Graphics::TBitmap *bmpImagen)
{
   TMemoryStream *msImagen = new TMemoryStream; <-- Ojo aqui
   TJPEGImage *jpgImagen = new TJPEGImage;
   jpgImagen->Assign(bmpImagen);
   jpgImagen->SaveToStream(msImagen);
   msImagen->Seek(0,soFromBeginning);
   delete jpgImagen;
   return msImagen;
}


al mandar llamar la funcion:
Código:

TMemoryStream *msFoto = new TMemoryStream; <-- Ojo aquí tambié
msFoto=BitmapAStream(imgVideo->Picture->Bitmap);


Si nos damos cuenta, antes de llamar la funcion, creamos el objeto msFoto, pero en la funcion, se vuelve a crear un objeto cuya referencia pasa a msFoto... entonces ahi dejamos bailando un espacio en memoria... aqui hay dos cosas... o creamos el objeto primero, y luego lo pasamos como parametro, para ahi hacer la asignacion, en vez devolver el puntero.. o bien, nada mas declaramos el puntero y no abrimos el espacio en memoria antes, ya que en la funcion se hace.... esto es algo peligroso, ya que puede ocurrir que al programador se le olvide liberar el espacio, ya que no lo creamos manualmente.... yo lo asi de la ultima manera porque en el momento se me hizo mas facil, y como yo se que se crea, se que debo destruirla....


para mi la mejor forma seria asi:

Código:
void BitmapAStream(Graphics::TBitmap *bmpImagen,TMemoryStream *msImagen)
{
   //TMemoryStream *msImagen = new TMemoryStream; <-- Eliminamos esta linea
   TJPEGImage *jpgImagen = new TJPEGImage;
   jpgImagen->Assign(bmpImagen);
   jpgImagen->SaveToStream(msImagen);
   msImagen->Seek(0,soFromBeginning);
   delete jpgImagen;
}


y al mandar llamar la funcion:
Código:

TMemoryStream *msFoto = new TMemoryStream; <-- Ahora si creamos el objeto
BitmapAStream(imgVideo->Picture->Bitmap,msFoto);  //Lo mandamos como parametro
.... //hafcemos topdo lo que tengamos que hacer
delete msFoto; //Destruimos le objeto



bueno, eso era todo.. saludos y adelante con este foro..
_________________
Dirección Municipal de Informática
H. Ayuntamiento de Tijuana
Arriba Lopez Obrador !!!
Los Mexicanos Merecemos Respeto !!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
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.