Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Error al guardar una Imagen JPG en un clientdataset (https://www.clubdelphi.com/foros/showthread.php?t=89094)

frandigo77 25-09-2015 13:06:14

Error al guardar una Imagen JPG en un clientdataset
 
Hola buenas foro, se van solucionando problemas..
Pues tengo uno que llevo timepo sin podr resolver y que deje en el tintero y ahora necesito solucionarlo y me produce
un error (Bitmap image is not valid). Utilizo Mysql y un campo LONGBLOB.

El error salta cuando realizo la asignacion al campo del dataset, el código es el siguiente:

Código Delphi [-]
procedure TdlgPersonal.acCargarFotoExecute(Sender: TObject);
var
  fs : TMemoryStream;
  imgJPG : TJpegImage;
begin
  if OpenPictureDialog1.Execute then
  begin
    imgJPG := TJpegImage.create;
    fs := TMemoryStream.Create;
    try
      imgJPG.LoadFromFile(OpenPictureDialog1.FileName);
      imgJPG.SaveToStream(fs);
      fs.Seek(0, soFromBeginning);
      try
        cxDBImage1.Picture.Assign(imgJPG);
        dmRPK03.cdsPersonaFoto.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;

Gracias..

ecfisa 25-09-2015 17:29:59

Hola frandigo77.

No conozco el componente cxDBImage, pero creo que deberías trabajar directamente sobre el campo no sobre el componente, ejemplo:

Código Delphi [-]
uses Jpeg;

procedure TForm1.btnLoadImageClick(Sender: TObject);

 function IsJPEGFile(const FileName: string): Boolean;
 var
   buf: array [0..3] of Byte;
   FS : TStream;
 begin
   FS := TFileStream.Create(FileName, fmOpenRead);
   try
    FS.Read(buf, SizeOf(buf));
    Result:= (buf[0]=$FF) and (buf[1]=$D8) and (buf[2]=$FF) and (buf[3]=$E0);
  finally
    FS.Free;
  end;
 end;

var
  Jpg    : TJPEGImage;
  Pic    : TPicture;
begin
  if OpenPictureDialog1.Execute then
  begin
    if IsJPEGFile(OpenPictureDialog1.FileName) then
    begin
      Jpg := TJPEGImage.Create;
      Pic := TPicture.Create;
      try
        Jpg.LoadFromFile(OpenPictureDialog1.FileName);
        Pic.Bitmap.Width  := Jpg.Width;
        Pic.Bitmap.Height := Jpg.Height;
        Pic.Bitmap.Assign(jpg);

        // guardar imágen seleccionada en el campo correspondiente
        ClientDataSet1.Edit;
        TBlobField(ClientDataSet1.FieldByName('IMAGE')).Assign(Pic);
        ClientDataSet1.Post;
      finally
        Jpg.Free;
        Pic.Free;
      end;
    end
    else raise Exception.Create('El archivo no contiene una imágen .JPG válida');
  end;
end;

Saludos :)

frandigo77 26-09-2015 14:07:34

Hola ecfisa, gracias por tan rápida atención. Probé el código que enviaste y funciona pero al intentar guardar los cambios
aparece el siguiente error:

[MySQL][ODBC 5.3(a) Driver] MySQL server has gone away. y seguidamente una violación de acceso a memória.

He probado a reiniciar el servidor pero cada ver que intento enviar el registro con el jpg, falla.
El campo de la tablsa es del tipo LONGBLOB y tiene la propiedad defaiult as NULL.

Tiene que ser algun parametro de condfiguración del servidor

Si puedes echarme una mano desde aqui, genial, sino lo pongo en el foro correspondiente..

Casimiro Notevi 26-09-2015 17:29:16

Sigue aquí en este hilo y da más detalles.

ecfisa 26-09-2015 19:53:43

Hola frandigo77.

Revisa si en estos enlaces encontras solución a ese error:
Saludos :)


La franja horaria es GMT +2. Ahora son las 20:27:16.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi