 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mar 31 Jul, 2007 1:48 pm Asunto: Insertar imagen en Firebird |
|
|
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 |
|
 |
ercea Ens

Registrado: 07 May 2007Mensajes: 48
|
Publicado: Mar 31 Jul, 2007 1:55 pm Asunto: |
|
|
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
saludos! |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mar 31 Jul, 2007 4:44 pm Asunto: |
|
|
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 |
|
 |
ercea Ens

Registrado: 07 May 2007Mensajes: 48
|
Publicado: Mar 31 Jul, 2007 8:52 pm Asunto: |
|
|
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
saludos! |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 01 Ago, 2007 8:45 am Asunto: |
|
|
Pues no logro que me grabe ninguna imagen. El código que tengo es este:
| 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 |
|
 |
rivo Lt JG

Registrado: 13 Mar 2004Mensajes: 72Ubicación: Asturias (España)
|
Publicado: Mie 01 Ago, 2007 11:10 am Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
rivo Lt JG

Registrado: 13 Mar 2004Mensajes: 72Ubicación: Asturias (España)
|
Publicado: Mie 01 Ago, 2007 12:51 pm Asunto: |
|
|
de nada!!, lo disfrutare, jajaja  |
|
| Volver arriba |
|
 |
pariente Cdt


Registrado: 25 Jul 2007Mensajes: 14Ubicación: Albacete
|
Publicado: Vie 14 Sep, 2007 3:35 pm Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 14 Sep, 2007 10:40 pm Asunto: |
|
|
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. _________________

Ultima edición por Cesar C. Salazar Gonzalez el Lun 17 Sep, 2007 12:02 pm, editado 1 vez |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 17 Sep, 2007 7:35 am Asunto: |
|
|
| 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  _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|