PDA

Ver la Versión Completa : Stream Write Error


giantonti1801
23-01-2023, 14:34:31
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'

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
...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.


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;


https://i.imgur.com/KXOm5CJ.gif

giantonti1801
23-01-2023, 18:20:34
;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.


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;


https://i.imgur.com/KXOm5CJ.gif

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 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 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
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.

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;