Utilizamos cookies propias y de terceros. [Más información sobre las cookies].
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki
Proyecto AjpdSoft: Foros

AjpdSoft :: Ver tema - Insertar imagen en tabla MySQL con Delphi
Foros de discusión Buscar Perfil FAQ Iniciar sesión
Information Insertar imagen en tabla MySQL con Delphi

Publicar nuevo tema Responder al tema
Foros de discusión » Borland Delphi, Codegear Delphi .Net   
Ver tema anterior :: Ver tema siguiente
AutorMensaje
varios
Magnífico usuario


Registrado: Oct 10, 2006
Mensajes: 2092

Asunto: Insertar imagen en tabla MySQL con Delphi Responder citando

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.
MensajePublicado:
Vie Mar 12, 2010 11:45 am
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Insertar imagen en tabla MySQL con Delphi Responder citando



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í:

Código:

uses
  Messages, SysUtils, Classes, Graphics, Controls,  Dialogs,
  StdCtrls, DBCtrls, Buttons, ExtCtrls, db, DBTables, forms, ComCtrls,
  variants, windows, Mask, ExtDlgs, jpeg;

type
...


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:

MensajePublicado:
Vie Mar 12, 2010 12:03 pm
Top of PageVer perfil de usuario
varios
Magnífico usuario


Registrado: Oct 10, 2006
Mensajes: 2092

Asunto: Re: Insertar imagen en tabla MySQL con Delphi Responder citando



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í:

Código:

uses
  Messages, SysUtils, Classes, Graphics, Controls,  Dialogs,
  StdCtrls, DBCtrls, Buttons, ExtCtrls, db, DBTables, forms, ComCtrls,
  variants, windows, Mask, ExtDlgs, jpeg;

type
...


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?
MensajePublicado:
Vie Mar 12, 2010 12:08 pm
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Insertar imagen en tabla MySQL con Delphi Responder citando



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;
MensajePublicado:
Vie Mar 12, 2010 6:11 pm
Top of PageVer perfil de usuario
agustinbus
Excelente usuario


Registrado: Apr 17, 2009
Mensajes: 38

Asunto: Otra manera diferente Responder citando

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!!!
MensajePublicado:
Vie Mar 12, 2010 7:31 pm
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Otra manera diferente Responder citando



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.
MensajePublicado:
Dom Mar 14, 2010 10:03 am
Top of PageVer perfil de usuario
agustinbus
Excelente usuario


Registrado: Apr 17, 2009
Mensajes: 38

Asunto: Re: Otra manera diferente Responder citando



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.
MensajePublicado:
Dom Mar 14, 2010 5:16 pm
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Otra manera diferente Responder citando



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.
MensajePublicado:
Lun Mar 15, 2010 11:02 am
Top of PageVer perfil de usuario
Mostrar mensajes de anteriores:   
Todas las horas son GMT - 1 Horas
Publicar nuevo tema Responder al tema
Foros de discusión » Borland Delphi, Codegear Delphi .Net  

Cambiar a:  
Key
  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