| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 27 Nov, 2008 11:54 am Asunto: Firebird: Guardar de imágenes |
|
|
Estoy teniendo problemas al insertar imágenes en una tabla Firebird. Tengo estos dos querys:
1. Para crear un registro nuevo
| Código: | Query->SQL->Text = "INSERT INTO Imagenes (Tabla, Registro, Posicion, Caratula) VALUES (:Tabla, :Registro, :Posicion, :Caratula)"; |
2. Para actualizar uno existente
| Código: | Query->SQL->Text = "UPDATE Imagenes SET Caratula = :Caratula WHERE Tabla = :Tabla AND Registro = :Registro AND Posicion = :Posicion"; |
La imagen está en un TImage del formulario y hago esto:
| Código: | TMemoryStream *msImagen = new TMemoryStream;
msImagen->Clear();
(Image1->Picture->Bitmap)->SaveToStream(msImagen);
msImagen->Seek(0,soFromBeginning);
Query->Close();
Query->ParamByName("Tabla")->AsString = "P";
Query->ParamByName("Registro")->AsInteger = nDisco;
Query->ParamByName("Posicion")->AsString = "P";
Query->ParamByName("Caratula")->LoadFromStream(msImagen, ftBlob);
Query->Prepare();
Query->ExecSQL(); |
Y no consigo que guarde la imagen que estoy viendo en el TImage. He estado mirando las preguntas que hay por el foro sobre este tema (varias mías) y no encuentro la forma de lograrlo. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
alfredo Master

Registrado: 13 Oct 2003Mensajes: 246Ubicación: Valencia Venezuela
|
Publicado: Vie 28 Nov, 2008 8:46 pm Asunto: |
|
|
| Hola, no estoy seguro pero creo que las consultas solo manejan texto en el SQL, haz un ShowMessage con el texto de la query despues de ejecutada y mira a ver que pasa. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Dom 30 Nov, 2008 7:51 am Asunto: |
|
|
Todo aclarado. El código funciona perfectamente; lo que no funciona perfectamente son mis neuronas y había un error de concepto: La tabla donde guardo las imágenes no es la misma que donde están guardadas las fichas correspondientes y al grabar no buscaba si la imagen existía o no, buscaba si existía la ficha. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
francisco rocha Ens

Registrado: 21 May 2008Mensajes: 26
|
Publicado: Mar 31 Ago, 2010 5:57 pm Asunto: Error al recuperar IMAGEN |
|
|
Hola, tome tu ejemplo para el manejo de imagen y tengo el problema al recuperar la imagen, solamente me aprece la mitad de la imagen correcto y la otra midad me muestra caracteres asci.
A que crees que se deba este problema, no se esta grabando bien o simplemente no lo trae bien. Te anexo mi codigo.
----GRABAR LA IMAGEN EN LA DB.
void __fastcall TfrmSelEmpresa::RzBitBtn1Click(TObject *Sender)
{
// Crea un TJPEGIMAGE y carga imagen.jpg
TJPEGImage *JImage = new TJPEGImage;
if (opdOpenImagen->Execute())
{
if (FileExists(opdOpenImagen->FileName))
JImage->LoadFromFile(opdOpenImagen->FileName);
Image1->Picture->Assign(JImage);
try
{
//GUARDAR LA IMAGEN EN BASE DE DATOS
dmCliente->dbProveedor->StartTransaction();
TMemoryStream *msImagen = new TMemoryStream;
TJPEGImage *jpg = new TJPEGImage();
msImagen->Clear();
// cargo el archivo..
jpg->LoadFromFile(opdOpenImagen->FileName);
jpg->SaveToStream(msImagen);
msImagen->Clear();
(Image1->Picture->Bitmap)->SaveToStream(msImagen);
msImagen->Seek(0,soFromBeginning);
if (msImagen != NULL) {
qsFoto->Close();
qsFoto->ParamByName("idCia")->AsInteger = stEmpresaSel.SubString(1,iPos-1).ToIntDef(0);
qsFoto->Open();
if (qsFoto->IsEmpty() ) {
qiFoto->Close();
qiFoto->ParamByName("idcia")->AsString = stEmpresaSel.SubString(1,iPos-1).ToIntDef(0);
qiFoto->ParamByName("foto" )->LoadFromStream(msImagen, ftBlob );
qiFoto->Prepare();
qiFoto->ExecSQL();
}else {
quFoto->Close();
quFoto->ParamByName("foto" )->LoadFromStream(ImagenToStream(opdOpenImagen->FileName ), ftBlob );
quFoto->ParamByName("idcia")->AsString = stEmpresaSel.SubString(1,iPos-1).ToIntDef(0);
quFoto->Prepare();
quFoto->ExecSQL();
}
}else {
ShowMessage("IMAGEN VACIA");
}
dmCliente->dbProveedor->Commit();
}
catch(...)
{ dmCliente->dbProveedor->Rollback();
}
CargarImagen(opdOpenImagen->FileName);
}
//eliminas el temporal para
delete JImage;
}
----AQUI RECUPERO LA IMAGEN GRABADA.
void __fastcall TfrmSelEmpresa::lstEmpresaClick(TObject *Sender)
{
//CARGAR LA FOTO
stEmpresaSel = lstEmpresa->Items->Strings[lstEmpresa->ItemIndex];
iPos = stEmpresaSel.AnsiPos(".");
qsSelCia->Close();
qsSelCia->ParamByName("Cia")->AsInteger = stEmpresaSel.SubString(1,iPos-1).ToIntDef(0);
qsSelCia->Open();
qsSucursales->Close();
qsSucursales->ParamByName("Cia")->AsInteger = stEmpresaSel.SubString(1,iPos-1).ToIntDef(0);
qsSucursales->Open();
//TRAE LA IMAGEN DEL DIRECTORIO ASIGNADO
TJPEGImage *JImage = new TJPEGImage;
//PARA TRAER LA FOTO DE LA BASE DE DATOS
qsFoto->Close();
qsFoto->ParamByName("idCia")->AsInteger = stEmpresaSel.SubString(1,iPos-1).ToIntDef(0);
qsFoto->Open();
String imagen = (qsFoto->FieldByName("foto")->AsString);
if(imagen!="")
{
TJPEGImage *jpg = new TJPEGImage();
Image1->Picture->Assign(BlobToJpg(((TBlobField*)qsFoto->FieldByName("foto") )));
delete jpg;
}
}
//---------------------------------------------------------------------------
TJPEGImage* __fastcall TfrmSelEmpresa::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);
}
//--------------------------------------------------------------------------- |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 01 Sep, 2010 3:41 pm Asunto: |
|
|
Te pongo el código que estoy usando para volcar las imágenes en un QRImage:
| Código: | qFoto->SQL->Text = "SELECT Foto FROM 'Fotos.db' WHERE Socio = " + Trim(Socio->Text);
qFoto->Open();
Application->CreateForm(__classid(TfCarnet), &fCarnet);
cPdfFile = ExtractFilePath(Application->ExeName) + "Adjuntos\\Socio" + FormatFloat("0", Query->FieldByName("Socio")->AsInteger) + ".pdf";
TQRPDFDocumentFilter *fFiltro = new TQRPDFDocumentFilter(cPdfFile);
fFiltro->AddFontMap("Arial:Helvetica");
fFiltro->StartConcat();
jpg = new TJPEGImage;
stream = new TMemoryStream;
((TBlobField*)qFoto->FieldByName("Foto"))->SaveToStream(stream);
stream->Seek(0, soFromBeginning);
jpg->LoadFromStream(stream);
if (stream->Size != 0)
fCarnet->QRImage3->Picture->Assign(jpg);
fCarnet->qCarnet->ExportToFilter(fFiltro);
fFiltro->EndConcat();
delete fFiltro; |
Con esto a mi no me da problemas. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
francisco rocha Ens

Registrado: 21 May 2008Mensajes: 26
|
Publicado: Jue 02 Sep, 2010 5:21 pm Asunto: Traer imagen de base de datos |
|
|
Muchas gracias por el codigo. Fijate que ya vi el problema y no era la rutina si no el tamaño de la imagen.
El JPG que estoy grabando tiene 129kb creo que por eso no me lo mostraba correctamente. ahora puse otro pero de 56kb y perfectamente lo desplega.
Ahora surge otro detalle como debo definir en mi base el tamaño de mi campo blob?
Gracias x tu ayuda.
Pako. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 03 Sep, 2010 6:46 am Asunto: Re: Traer imagen de base de datos |
|
|
| francisco rocha escribió: | | Ahora surge otro detalle como debo definir en mi base el tamaño de mi campo blob? |
No tienes que decirle nada sobre el tamaño del campoo blob al definir la base de datos más allá del tipo de dato que se va guardar en ese campo. Ten en cuenta que en esos campos se pueden guardar tanto imágenes co, por ejemplo, un fichero pdf. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
|