Estoy desarrollando una aplicación de Facturación, tengo una tabla de usuarios, con los datos típicos: nick, contraseña, nombre, etc. Quiero añadirle a esta ventana la funcionalidad de insertar una foto por usuario y que aparezca al mostrar la ventana.
Utilizo Delphi 6 y MySQL como base de datos.
¿Qué tipo de datos debo poner en la tabla de MySQL para guardar la foto? quiero guardar la foto en la tabla, no quiero guardarla en una carpeta del equipo pues quiero que sea accesible desde fuera de la oficina.
Publicado:
Vie Mar 12, 2010 11:45 am
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Insertar imagen en tabla MySQL con Delphi
Anuncios
varios escribió:
Estoy desarrollando una aplicación de Facturación, tengo una tabla de usuarios, con los datos típicos: nick, contraseña, nombre, etc. Quiero añadirle a esta ventana la funcionalidad de insertar una foto por usuario y que aparezca al mostrar la ventana.
Utilizo Delphi 6 y MySQL como base de datos.
¿Qué tipo de datos debo poner en la tabla de MySQL para guardar la foto? quiero guardar la foto en la tabla, no quiero guardarla en una carpeta del equipo pues quiero que sea accesible desde fuera de la oficina.
Puedes hacer lo siguiente:
1. En la tabla de MySQL, el tipo de datos a utilizar para el campo que contendrá la foto es LONGBLOB.
2. En el formulario de inserción de la foto, si quieres utilizar el formato JPEG, puedes utilizar el siguiente código. En el formulario debes añadir un TButton (nosotros lo hemos llamado "bInsertarFoto"), un TImage (nosotros lo hemos llamado "imgFoto") y un TOpenPictureDialog (nosotros lo hemos llamado "dlAbrirFoto"). En el evento Click del TButton añades:
Código:
procedure TformGUsuario.bInsertarFotoClick(Sender: TObject);
var
fs : TMemoryStream;
imgJPG : TJpegImage;
begin
if dlAbrirFoto.Execute then
begin
imgJPG := TJpegImage.create;
fs := TMemoryStream.Create;
try
imgJPG.LoadFromFile(dlAbrirFoto.FileName);
imgJPG.SaveToStream(fs);
fs.Seek(0, soFromBeginning);
try
imgFoto.Picture.Assign(imgJPG);
tablaUsuarioFoto.LoadFromStream(fs);
finally
fs.free;
end;
except
on E : Exception do
begin
MessageDlg('Asegúrese de que la imagen seleccionada es de ' +
' tipo JPEG con formato correcto. ' + chr(13) + chr(13) +
'El error concreto: ' + E.ClassName + ': ' +
E.Message, mtError, [mbOK], 0);
end;
end;
end;
end;
Ten en cuenta que:
1. En el USES del formulario debes añadir "jpg", algo así:
2. Ten en cuenta también que "tablaUsuarioFoto" es el nombre del campo "Foto" de la tabla "tablaUsuario" (un componente de tipo TTable). Hemos añadido el campo "foto" a la tabla "usuario" de MySQL y lo hemos agregado al componente "TTable" de Delphi:
Publicado:
Vie Mar 12, 2010 12:03 pm
varios Magnífico usuario
Registrado: Oct 10, 2006 Mensajes: 2092
Asunto: Re: Insertar imagen en tabla MySQL con Delphi
Anuncios
alonsojpd escribió:
Puedes hacer lo siguiente:
1. En la tabla de MySQL, el tipo de datos a utilizar para el campo que contendrá la foto es LONGBLOB.
2. En el formulario de inserción de la foto, si quieres utilizar el formato JPEG, puedes utilizar el siguiente código. En el formulario debes añadir un TButton (nosotros lo hemos llamado "bInsertarFoto"), un TImage (nosotros lo hemos llamado "imgFoto") y un TOpenPictureDialog (nosotros lo hemos llamado "dlAbrirFoto"). En el evento Click del TButton añades:
Código:
procedure TformGUsuario.bInsertarFotoClick(Sender: TObject);
var
fs : TMemoryStream;
imgJPG : TJpegImage;
begin
if dlAbrirFoto.Execute then
begin
imgJPG := TJpegImage.create;
fs := TMemoryStream.Create;
try
imgJPG.LoadFromFile(dlAbrirFoto.FileName);
imgJPG.SaveToStream(fs);
fs.Seek(0, soFromBeginning);
try
imgFoto.Picture.Assign(imgJPG);
tablaUsuarioFoto.LoadFromStream(fs);
finally
fs.free;
end;
except
on E : Exception do
begin
MessageDlg('Asegúrese de que la imagen seleccionada es de ' +
' tipo JPEG con formato correcto. ' + chr(13) + chr(13) +
'El error concreto: ' + E.ClassName + ': ' +
E.Message, mtError, [mbOK], 0);
end;
end;
end;
end;
Ten en cuenta que:
1. En el USES del formulario debes añadir "jpg", algo así:
2. Ten en cuenta también que "tablaUsuarioFoto" es el nombre del campo "Foto" de la tabla "tablaUsuario" (un componente de tipo TTable). Hemos añadido el campo "foto" a la tabla "usuario" de MySQL y lo hemos agregado al componente "TTable" de Delphi:
Ok, me funciona la inserción, me aparece la imagen en el TImage y, supongo, se inserta en la tabla de MySQL en el campo "foto" de tipo LONGBLOB.
Pero ¿cómo muestro la imagen, como la obtengo de la tabla y la muestro en el formulario para el registro actual?
Publicado:
Vie Mar 12, 2010 12:08 pm
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Insertar imagen en tabla MySQL con Delphi
Anuncios
varios escribió:
Ok, me funciona la inserción, me aparece la imagen en el TImage y, supongo, se inserta en la tabla de MySQL en el campo "foto" de tipo LONGBLOB.
Pero ¿cómo muestro la imagen, como la obtengo de la tabla y la muestro en el formulario para el registro actual?
En el evento "FormCreate" puedes añadir:
Código:
procedure TformGUsuario.FormCreate(Sender: TObject);
var
fs : TMemoryStream;
imgJPG : TJpegImage;
begin
if not tablaUsuario.FieldByName('foto').IsNull then
begin
imgJPG:= TJpegImage.create;
fs := TMemoryStream.Create();
tablaUsuarioFoto.SaveToStream(fs);
fs.Seek(0, soFromBeginning);
imgJPG.LoadFromStream(fs);
try
imgFoto.Picture.Assign(imgJPG);
finally
fs.free;
end;
end;
end;
Publicado:
Vie Mar 12, 2010 6:11 pm
agustinbus Excelente usuario
Registrado: Apr 17, 2009 Mensajes: 38
Asunto: Otra manera diferente
Yo lo hago de una manera mas simple, aunque no se si mejor.
Creo un campo LONGBLOB en mi tabla sql por ejemplo: Imagen.
Luego haces dobre clic en el ADOQuery que se refiere a la tabla que tiene el campo Imagen y aparece lo siguiente (sigue los pasos de la imagen):
DONDE DICE "CLIC DERECHO Y APARECE ESTO", hay que hacer clic derecho y seleccionar New Field
Una vez hecho esto vamos al evento onclick de un boton por ejemplo y ponemos el siguiente codigo:
Código:
ADOQuery1.Open;
ADOQuery1.Insert;
if OpenPictureDialog1.FileName <>'' then
begin
ADOuery1IMAGEN.LoadFromFile (OpenPictureDialog1.FileName);
end;
ADOQuery1.Post
De esa manera lo almacenamos en la base de datos y para poder mostrarlo en un TImage ponemos este codigo:
Código:
if ADOQuery1.FieldByName ('IMAGEN').AsVariant <> '' then
begin
Image1.Picture.Bitmap.Assign(ADOQuery1IMAGEN );
end
else
begin
Form1.Image1.Picture := Nil;
end;
ESTE EJEMPLO SOLO SIRVE PARA IMAGENES .BMP!!!
Publicado:
Vie Mar 12, 2010 7:31 pm
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Otra manera diferente
Anuncios
agustinbus escribió:
Yo lo hago de una manera mas simple, aunque no se si mejor.
Creo un campo LONGBLOB en mi tabla sql por ejemplo: Imagen.
Luego haces dobre clic en el ADOQuery que se refiere a la tabla que tiene el campo Imagen y aparece lo siguiente (sigue los pasos de la imagen):
DONDE DICE "CLIC DERECHO Y APARECE ESTO", hay que hacer clic derecho y seleccionar New ...
Muchísimas gracias Agustinbus por tu aportación. Efectivamente, si no es necesario utilizar JPG, el proceso es mucho más sencillo, tal y como nos indicas, incluso es posible utilizar el componente TDBImage, con el que no es necesario programar nada para que muestre la imagen. Es más, este componente admite copiar y pegar, es decir, se puede pegar una imagen en el TDBImage sin código fuente, con Control C y Control V. Pero el inconveniente es que este procedimiento sólo vale para imágenes BMP.
Así pues, lo que hemos expuesto nosotros más lo que ha expuesto Agustinbus servirá para que el usuario tenga las dos posibilidades.
Publicado:
Dom Mar 14, 2010 10:03 am
agustinbus Excelente usuario
Registrado: Apr 17, 2009 Mensajes: 38
Asunto: Re: Otra manera diferente
Anuncios
alonsojpd escribió:
agustinbus escribió:
Yo lo hago de una manera mas simple, aunque no se si mejor.
Creo un campo LONGBLOB en mi tabla sql por ejemplo: Imagen.
Luego haces dobre clic en el ADOQuery que se refiere a la tabla que tiene el campo Imagen y aparece lo siguiente (sigue los pasos de la imagen):
DONDE DICE "CLIC DERECHO Y APARECE ESTO", hay que hacer clic derecho y seleccionar New ...
Muchísimas gracias Agustinbus por tu aportación. Efectivamente, si no es necesario utilizar JPG, el proceso es mucho más sencillo, tal y como nos indicas, incluso es posible utilizar el componente TDBImage, con el que no es necesario programar nada para que muestre la imagen. Es más, este componente admite copiar y pegar, es decir, se puede pegar una imagen en el TDBImage sin código fuente, con Control C y Control V. Pero el inconveniente es que este procedimiento sólo vale para imágenes BMP.
Así pues, lo que hemos expuesto nosotros más lo que ha expuesto Agustinbus servirá para que el usuario tenga las dos posibilidades.
Asi es! Antes utilizaba DBImage que es muchisimo mas facil, pero si mal no recuerdo, creo que el DBImage no tiene la propiedad proportional, que es para mantener las proporciones de la imagen cuando agrandamos o achicamos el componente y la imagen no se deforme. Por esa razon utilizo Image en vez de DBImage. Todas son opciones válidas, dependiendo de lo que uno necesite.
Publicado:
Dom Mar 14, 2010 5:16 pm
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Otra manera diferente
Anuncios
Por rizar el rizo y por si le sirve a alguien, indico cómo cargar una imagen de un TTable (base de datos) en un TImage sin necesidad de agregar el campo al TTable:
Código:
uses ...
jpeg
...
var
fs : TMemoryStream;
imgJPG : TJpegImage;
blobF : TBlobField;
begin
//foto
if not tabla.FieldByName('foto').IsNull then
begin
imgJPG := TJpegImage.create;
fs := TMemoryStream.Create();
blobF := tabla.fieldbyname('foto') as TBlobField;
blobF.SaveToStream(fs);
fs.Seek(0, soFromBeginning);
imgJPG.LoadFromStream(fs);
try
imgFoto.Picture.Assign(imgJPG);
finally
fs.free;
end;
end;
...
Donde:
* tabla: componente TTable de Delphi.
* imgFoto: componente de tipo TImage de Delphi.
Puede publicar nuevos temas en este foro No puede responder a temas en este foro No puede editar sus mensajes en este foro No puede borrar sus mensajes en este foro No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A