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 

Blob y JPG en base de datos
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Tips & Tricks
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Blob y JPG en base de datos Responder citando

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
_________________
Cool


Ultima edición por Cesar C. Salazar Gonzalez el Jue 30 Nov, 2006 10:22 am, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Pregunta Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

una buena observacion, pero al salir de la funcion, los objetos dejan de existir.

saludos...
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Código:
delete jpg;

y al cerrar la llave correspondiente...
Código:
delete imagen;


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 Exclamation ).
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

En lugar de regresar el JPG (TJPEGImage *JPeg = new TJPEGImageWink 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);

_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Tamaño de la Imagen Responder citando

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.
Rolling Eyes
_________________
La caja decía, requiere Win95 o superior así que instalé Linux.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: pierde definición Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Resolución nítida Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

De casualidad no tienes pero para tablas en MySql.....
gracias.
_________________
><(((((º> From °l||l° §ÂN ÅNЮ€$ i§Lã$ °l||l°
_____________________
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email 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.