| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mie 23 Nov, 2005 7:32 pm Asunto: Blob y JPG en base de datos |
|
|
usando las siguente funciones se puede meter e insertar una imagen desde el disco y guardarla dentro de un campo blob
por referencia dire que el campo blob de una base de datos lo he declarado de la siguiente manera
| Cita: | | foto BLOB sub_type 0 segment size 80, |
para una tabla de Firebird/Interbase
la funcion para meter la imagen dentro del campo es la siguente se pasa como parametro la ruta del archivo para traerlo
| Código: | //----------------------------------------------------------------
// CARGA UNA IMAGEN Y REGRESA UN STREAM
TMemoryStream * __fastcall ImagenToStream(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
)
{
const int HIMETRIC_INCH = 2540;
TImage *imagen = new TImage(NULL);
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);
}
}
return(StreamTmp);
} |
Ejemplo:
| Cita: | | TuBase->TuTablFoto->LoadFromStream(::ImagenToStream(this->OpenPictureDialog1->FileName)); |
donde Foto es el campo blob de la bae de datos.
y para extraer la foto de un campo blob y verla dentro de un TImage usamos la siguiente funcion
| Código: | 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 un ejemplo de hacer es el siguiente
| Código: | this->Image1->Picture->Assign(::BlobToJpg(::DMREMOTO->BD_EmpresaE_LOGO1_IMAGEN)); |
bueno estamos en contacto...
saludos _________________

Ultima edición por Cesar C. Salazar Gonzalez el Jue 30 Nov, 2006 10:22 am, editado 1 vez |
|
| Volver arriba |
|
 |
listeroabsoluto Cdt


Registrado: 23 Nov 2005Mensajes: 2
|
Publicado: Mie 23 Nov, 2005 11:41 pm Asunto: |
|
|
Gracias por tu aporte!
Este es mi primer post, en forma de agradecimiento para Cesar (Gracias por la info de éste foro... no sabia que existia).
Voy a probarlo, gracias de nuevo. _________________ Saludos y gracias. |
|
| Volver arriba |
|
 |
edwinhp Cdt

Registrado: 11 Ago 2005Mensajes: 5
|
Publicado: Vie 25 Nov, 2005 7:07 am Asunto: Pregunta |
|
|
Veo que se crean objectos y no se libera la memoria, algún comentario al respecto??? _________________ Si puedo ayudarles en algo, no duden en consultarme !!! |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 25 Nov, 2005 3:11 pm Asunto: |
|
|
una buena observacion, pero al salir de la funcion, los objetos dejan de existir.
saludos... _________________
 |
|
| Volver arriba |
|
 |
juanma Cmdr

Registrado: 17 Nov 2005Mensajes: 127Ubicación: Almeria - España
|
Publicado: Vie 25 Nov, 2005 6:30 pm Asunto: |
|
|
Antes de nada y para evitar confusiones, diré que seguro no estoy!
Pero creo que aunque los objetos sean locales a la funcion, la memoria cogida con new habria que liberarla con delete.
Asi, en loa primera funcion antes de salir colocaría
y al cerrar la llave correspondiente...
En la segunda funcion antes de salir
| Código: | delete StreamTmp; |
Aun nos queda la memoria que devuelven las funciones, que al no asignarlas a ninguna variable sino que directamente se utiliza la direccion, no tendriamos forma para liberarla.
Como he dicho anteriormente espero no confundir a nadie (aunque para eso mejor no decir nada ). |
|
| Volver arriba |
|
 |
Picard Master


Registrado: 18 Ene 2004Mensajes: 218Ubicación: Palamos (Girona) España
|
Publicado: Vie 03 Feb, 2006 12:47 pm Asunto: |
|
|
Muy interesante Cesar, pero y si la Db es Access y el formato de la imagen es .Bmp y esta insertada en el campo (me refiero a que la imagen esta en el campo,no el path de la imagen)? yo estoy teniendo serios problemas con esto encontra esto, pero no consigo adaptarlo a C++[url] http://www.efg2.com/Lab/Library/Delphi/ADO/Northwind/index.html#DBImage [/url] _________________ El hombre es el unico ser que tropieza dos veces en la misma piedra ( en mi caso infinitas veces) |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 03 Feb, 2006 7:29 pm Asunto: |
|
|
En lugar de regresar el JPG (TJPEGImage *JPeg = new TJPEGImage de la segunda funcion pudes usar la sentencia
| Código: | Graphics::TBitmap *pBitMap = new Graphics::TBitmap ; | y cargar desdel el blob con las mismas indicaciones hacia el stream temporal
| Código: | TMemoryStream *StreamTmp = new TMemoryStream |
posteriormente la cargamos al stream
| Código: | CampoBLOB->SaveToStream(StreamTmp); |
despues que lo pases, al stream puedes cargarlo con cualquiera de las siguientes 2 sentencias derivadas de TBitmap
| Código: | pBitMap->LoadFromStream(StreamTmp);
pBitMap->Assign(StreamTmp); |
_________________
 |
|
| Volver arriba |
|
 |
tronxx Lt JG


Registrado: 30 May 2003Mensajes: 56Ubicación: Merida, Yucatan, Mexico
|
Publicado: Jue 24 Ago, 2006 3:38 pm Asunto: Tamaño de la Imagen |
|
|
Y que tamaño de la imagen debe ser ?, por que cuando cargo una imagen chica, a todas margaritas, pero cuando cargo una imagen mas o menos grande solo se ve el 75% de arriba a abajo, es decir, la parte inferior se ven cosas grises, como hacer para que se grabe la imagen completa ? necesito grabar portadas de discos.
Gracias.
 _________________ La caja decía, requiere Win95 o superior así que instalé Linux. |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Sab 26 Ago, 2006 12:55 am Asunto: |
|
|
el tamaño de la imagen, no tiene nada que ver, puesto que estoy usando un monitor de alta resolución con imagenes de 1280 x 1024 pixeles, y no he tenido problemas en guardar las imagenes capturadas del escritorio dentro de la base de datos.
saludos, revisa si alguno de tus componentes que usas no esta dañado _________________
 |
|
| Volver arriba |
|
 |
tronxx Lt JG


Registrado: 30 May 2003Mensajes: 56Ubicación: Merida, Yucatan, Mexico
|
Publicado: Vie 15 Sep, 2006 7:31 pm Asunto: pierde definición |
|
|
Hola, pues fíjate que usando las funciones que posteaste está muy bien, de hecho, el problema del tamaño de las imágenes lo resolví cambiando el parámetro :
// const int HIMETRIC_INCH = 2540;
const int HIMETRIC_INCH = 10160;
y con eso me guarda las imagenes completas, pero la definición se pierde horrible, y es que como uso un TImage en una panel con aling = Client
y la función Stretch para visualizarla pues la descompone. pero se descompone aunque la relación sea 1:1, es decir, mi TImage tenga el tamaño de la imagen original. _________________ La caja decía, requiere Win95 o superior así que instalé Linux. |
|
| Volver arriba |
|
 |
tronxx Lt JG


Registrado: 30 May 2003Mensajes: 56Ubicación: Merida, Yucatan, Mexico
|
Publicado: Vie 15 Sep, 2006 8:52 pm Asunto: Resolución nítida |
|
|
Mira, leyendo un poco encontré que un campo blob tiene una propiedad LoadFromFile, asi que usé esa función y quedó a todas margaritas:
qry_imagenIMAGEN->LoadFromFile(edt_archivo->Text);
Gracias.
Asi si retiene resolución, tamaño y todo. _________________ La caja decía, requiere Win95 o superior así que instalé Linux. |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Dom 17 Sep, 2006 1:27 pm Asunto: |
|
|
como un comentario, el proceso de carga a un campo BLOB es de forma binaria, efectivamente usando la funcion LoadFromFile, cargas el archivo.. la funcion mencionada arriba es para convertir algunos de los formatos de archivos de imagenes en jpg, para no ocupar mucho espacio en la base de datos...
saludos.. y a seguir colaborando _________________
 |
|
| Volver arriba |
|
 |
likibuay Master


Registrado: 24 Abr 2006Mensajes: 190Ubicación: COLOMBIA
|
Publicado: Vie 20 Oct, 2006 8:50 am Asunto: |
|
|
De casualidad no tienes pero para tablas en MySql.....
gracias. _________________ ><(((((º> From °l||l° §ÂN ÅNЮ€$ i§Lã$ °l||l°
_____________________ |
|
| Volver arriba |
|
 |
likibuay Master


Registrado: 24 Abr 2006Mensajes: 190Ubicación: COLOMBIA
|
Publicado: Vie 21 Ago, 2009 6:06 am Asunto: |
|
|
buenas...compila sin errores si lo hago asi... pero me guarda Null en la base de datos (mysql) y builder 6
de antemano gracias...por la ayuda y la atención prestada
| Código: |
TMemoryStream *stream = new TMemoryStream;
stream=ImagenToStream(this->LMDBrowseEdit1->Path);
AnsiString consulta="insert into imagenes values('1',:stream)";
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add(consulta);
Query1->ExecSQL();
Query1->Close(); |
_________________ ><(((((º> From °l||l° §ÂN ÅNЮ€$ i§Lã$ °l||l°
_____________________ |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 21 Ago, 2009 7:42 am Asunto: |
|
|
Creo que el proceso para insertar Imágenes en Campos BLOB de bases de datos para MySQL no es el mismo que usas, este procedimiento asume que el campo al cual te refieres es un campo de "x" tabla pero este campo debe hacerse como referencia sobre un componente de Bases de datos.
Es decir, para que tu puedas "insertar" literalmente una imágen, debes mantener una conexión viva al campo, hablamos de conexiones vivas a aquellas donde el componente que representa un campo de la base de datos existe; y no es precisamente una consulta SQL para insertar información puedes ayudarte de el siguiente enlace que presenta un ejemplo del uso de campos Blob de MySQL usando los componetes dbExpress, usando el ejemplo del codigo de arriba y realizando algunas modificaciones al ejemplo del enlace, puedes insertar imágenes en los campos blob _________________
 |
|
| Volver arriba |
|
 |
|