| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
jmunozperez Invitado
|
Publicado: Lun 23 Feb, 2004 1:26 am Asunto: Guardar una foto en una BD |
|
|
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 ... espero que me ayuden... seria muy genial |
|
| Volver arriba |
|
 |
alfredo Master

Registrado: 13 Oct 2003Mensajes: 246Ubicación: Valencia Venezuela
|
Publicado: Jue 26 Feb, 2004 10:23 pm Asunto: |
|
|
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 |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Vie 24 Sep, 2004 3:53 pm Asunto: |
|
|
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 |
|
 |
LordNemesis Master


Registrado: 31 Dic 2003Mensajes: 340Ubicación: México
|
Publicado: Vie 24 Sep, 2004 4:20 pm Asunto: |
|
|
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 |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Vie 24 Sep, 2004 8:06 pm Asunto: |
|
|
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  _________________ Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc
http://www.touchsoftwares.com |
|
| Volver arriba |
|
 |
LordNemesis Master


Registrado: 31 Dic 2003Mensajes: 340Ubicación: México
|
Publicado: Vie 24 Sep, 2004 10:28 pm Asunto: |
|
|
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 |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Dom 03 Oct, 2004 8:16 pm Asunto: |
|
|
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 |
|
 |
LordNemesis Master


Registrado: 31 Dic 2003Mensajes: 340Ubicación: México
|
Publicado: Lun 04 Oct, 2004 6:07 pm Asunto: |
|
|
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 |
|
 |
|