Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Stream Write Error (https://www.clubdelphi.com/foros/showthread.php?t=96072)

giantonti1801 23-01-2023 14:34:31

Stream Write Error
 
hola amigo en esta ocasión estoy desarrollando una aplicación con delphi 11 en multiplataforma y quiero reducir las imagen. esta misma funcion la estoy utilizando en una aplicacion para android y me finciona perfecto pero ahora la estoy implementando en windows 64BIt y me da error de 'Stream Write Error'

Código Delphi [-]
procedure TFormLogin.SpeedButtonGuardarClick(Sender: TObject);
var
Image: TBitmap;
bmp: TBitmap;
NewBitmap: TBitmap;
MS1 : TMemoryStream;
Surf: TBitmapSurface;
JpgQuality : TBitmapCodecSaveParams;
begin
   NewBitmap := ImageFotoReg.bitmap;
   MS1 := TMemoryStream.Create;
   Surf := TBitmapSurface.create;
   try
   MS1.Position := 0;
   Surf.Assign(NewBitmap);
   JpgQuality.Quality := 30;
     if not TBitmapCodecManager.SaveToStream(MS1, Surf, '.jpg', @JpgQuality) then
     raise EBitmapSavingFailed.Create('Error saving Bitmap to jpg');
      begin

        if editNombre.text = '' then
        //   begin
           ShowMessage('El nombre no puede estar vacio');
        if editApellido.text = '' then
           ShowMessage('El Apellidos no puede estar vacio');
        if editRUT.text = '' then
           ShowMessage('El RUT no puede estar vacio') ;
        if editCodigo.text = '' then
           ShowMessage('El Codigo de Medigo no puede estar vacio');
        if editTelefono.text = '' then
           ShowMessage('El Telefono no puede estar vacio');
        if editciudad.text = '' then
           ShowMessage('El Ciudad no puede estar vacio');
        if EditrRegion.text = '' then
           ShowMessage('El Region no puede estar vacio') ;
        if editDireccion.text = '' then
           ShowMessage('La Direccion no puede estar vacia');
        if editlogin.text = '' then
           ShowMessage('El Login no puede estar vacio')
        //if editPassword.text = '' then
        //   ShowMessage('El Password no puede estar vacio')

       else
        begin

          UniQuery1.Close;
          UniQuery1.SQL.Clear;
          UniQuery1.SQL.Add('INSERT INTO Login (NOM,APE,RUT,CODMED,TEL,DIR,CIUDAD,ESTADO,FOTO, FECHAREG,LOGIN, PAS, INST)');           //
          UniQuery1.SQL.Add('VALUES (:NOM :APE :RUT :CODMED :TEL :DIR :CIUDAD :ESTADO :FOTO :FECHAREG :LOGIN :PAS :INST)');                      //,
          UniQuery1.ParamByName('NOM').AsString := EDITNombre.text;
          UniQuery1.ParamByName('APE').AsString := EditApellido.Text;
          UniQuery1.ParamByName('RUT').Asstring := EditRUT.text;
          UniQuery1.ParamByName('CODMED').AsString := EditCodigo.text;
          UniQuery1.ParamByName('TEL').AsString := EditTelefono.TEXT;
          UniQuery1.ParamByName('CIUDAD').Asstring := EditCiudad.TEXT;
          UniQuery1.ParamByName('ESTADO').Asstring := EditRREGION.TEXT;
          UniQuery1.ParamByName('DIR').Asstring := EditDireccion.TEXT;
          UniQuery1.ParamByName('INST').Asstring := ComboBoxInst.Items.Text;
          UniQuery1.ParamByName('LOGIN').Asstring := EditLOGIN.TEXT;
          UniQuery1.ParamByName('PAS').Asstring := EditPASSWORD.TEXT;
          UniQuery1FOTO.LoadFromStream(MS1);
          UniQuery1.ExecSQL;
          end;
        end;
       //end;
   finally
    //NewBitmap.Free;
    MS1.Free;
    Surf.Free;
   end;
end;

mucho agradecería su ayuda.

Neftali [Germán.Estévez] 23-01-2023 16:55:59

Cita:

Empezado por giantonti1801 (Mensaje 550130)
...pero ahora la estoy implementando en windows 64BIt y me da error de 'Stream Write Error'

El código siguiente funciona correctamente y guarda la imagen correctamente es disco y la muestra en otro control de imagen.
Está basado en el tuyo.

Lo he probado correctamente en Delphi 11.2.
deberías explicar en qué versión estás trabajando. Y en todo caso debuggar en Windows para ver la línea donde te falla.

Código Delphi [-]
uses
  FMX.Surfaces;

procedure TForm3.Button1Click(Sender: TObject);
var
  NewBitmap: TBitmap;
  MS1: TMemoryStream;
  Surf: TBitmapSurface;
  JpgQuality: TBitmapCodecSaveParams;
begin
  //
  NewBitmap := ImageFotoReg.bitmap;
  MS1 := TMemoryStream.Create;
  Surf := TBitmapSurface.Create;
  try
    MS1.Position := 0;
    Surf.Assign(NewBitmap);
    JpgQuality.Quality := 30;

    if not TBitmapCodecManager.SaveToStream(MS1, Surf, '.jpg', @JpgQuality) then
      raise EBitmapSavingFailed.Create('Error saving Bitmap to jpg');

    // Grabarla en disco (JPG)
    MS1.SaveToFile('r:\out.jpg');

    // Cargarla en otro componente
    ImageFotoReg2.Bitmap.LoadFromFile('r:\OUT.jpg');

  finally
    MS1.Free;
    Surf.Free;
  end;
end;

procedure TForm3.FormShow(Sender: TObject);
begin
  // cargar la imagen de disco (BMP)
  ImageFotoReg.Bitmap.LoadFromFile('r:\IN.bmp');
end;


giantonti1801 23-01-2023 18:20:34

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 550133)
El código siguiente funciona correctamente y guarda la imagen correctamente es disco y la muestra en otro control de imagen.
Está basado en el tuyo.

Lo he probado correctamente en Delphi 11.2.
deberías explicar en qué versión estás trabajando. Y en todo caso debuggar en Windows para ver la línea donde te falla.

Código Delphi [-]
uses
  FMX.Surfaces;

procedure TForm3.Button1Click(Sender: TObject);
var
  NewBitmap: TBitmap;
  MS1: TMemoryStream;
  Surf: TBitmapSurface;
  JpgQuality: TBitmapCodecSaveParams;
begin
  //
  NewBitmap := ImageFotoReg.bitmap;
  MS1 := TMemoryStream.Create;
  Surf := TBitmapSurface.Create;
  try
    MS1.Position := 0;
    Surf.Assign(NewBitmap);
    JpgQuality.Quality := 30;

    if not TBitmapCodecManager.SaveToStream(MS1, Surf, '.jpg', @JpgQuality) then
      raise EBitmapSavingFailed.Create('Error saving Bitmap to jpg');

    // Grabarla en disco (JPG)
    MS1.SaveToFile('r:\out.jpg');

    // Cargarla en otro componente
    ImageFotoReg2.Bitmap.LoadFromFile('r:\OUT.jpg');

  finally
    MS1.Free;
    Surf.Free;
  end;
end;

procedure TForm3.FormShow(Sender: TObject);
begin
  // cargar la imagen de disco (BMP)
  ImageFotoReg.Bitmap.LoadFromFile('r:\IN.bmp');
end;


estoy desarrollando con multidevise y complicado en windows 64bit tengo Embarcadero® RAD Studio 11 Versión 28.0.45591.0253 la cuestión que este mismo código me sirvió en una aplicación que estaba haciendo con android y fue adaptado en este moemnto para recuperar la imagen directamente del streams, también tengo otro problema si agrego el JPEG (ME DA ERROR) en los uses por lo que estoy utilizando el
Código Delphi [-]
Vcl.Imaging.jpeg, FMX.Surfaces;
la otra cuestión es que no quisiera guardar la imagen en el PC del Cliente además que aunque lo haga no voy a poder guardarla o cargarla
Código Delphi [-]
ImageFotoReg2.Bitmap.LoadFromFile('r:\OUT.jpg');
ya que me pide el JPEG en lo uses. entonces caigo en el mismo circulo. la idea es que pueda guardar la imagen el JPG en la base de dato

Neftali [Germán.Estévez] 24-01-2023 09:57:48

1 Archivos Adjunto(s)
Te adjunto el proyecto de ejemplo que he utilizado.
Pruebalo, cambiando los path de disco a ver si te funciona.

A partir de ahí puedes ir añadiendo cosas. Es un proyecto "multidevice" y lo he probado con win32 y Win64.

esublim 21-02-2023 23:55:56

quioero hacer eso pero al momento de guardar que reduzca el tamaño a mitad se podra. es decir si la imagen esta 1000x1000px se redusca a 500x500 px

Neftali [Germán.Estévez] 22-02-2023 11:35:52

Basta con decírselo a la variable que almacena el bitmap.
Añade la línea en rojo al código anterior.

Código Delphi [-]
procedure TForm3.Button1Click(Sender: TObject);
var
  NewBitmap: TBitmap;
  MS1: TMemoryStream;
  Surf: TBitmapSurface;
  JpgQuality: TBitmapCodecSaveParams;
begin
  NewBitmap := ImageFotoReg.bitmap;
  MS1 := TMemoryStream.Create;
  Surf := TBitmapSurface.Create;
  try
    MS1.Position := 0;

    // Reducir la imagen original a la mitad
    NewBitmap.Resize(NewBitmap.Width DIV 2, NewBitmap.Height DIV 2);

    Surf.Assign(NewBitmap);
    JpgQuality.Quality := 30;

    if not TBitmapCodecManager.SaveToStream(MS1, Surf, '.jpg', @JpgQuality) then
      raise EBitmapSavingFailed.Create('Error saving Bitmap to jpg');

    // Grabarla en disco (JPG)
    MS1.SaveToFile('r:\out.jpg');

    // Cargarla en otro componente
    ImageFotoReg2.Bitmap.LoadFromFile('r:\OUT.jpg');

  finally
    MS1.Free;
    Surf.Free;
  end;
end;


La franja horaria es GMT +2. Ahora son las 15:29:55.

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