Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   Reducir resolucion de imagen (https://www.clubdelphi.com/foros/showthread.php?t=96032)

giantonti1801 05-01-2023 17:53:17

Reducir resolucion de imagen
 
hola amigo estoy guardando las imagen en MySQL en un campo BlobLong cada foro pesa como más de 3 MG esto me está causando retrasos en las operaciones de la base de datos como consultas, inserciones etc. estoy tomando la foto con la cámara del dispositivo pero NO necesito que tenga buena resolución por lo que hay alguna forma de guardar esta imagen en una resolución reducida incluso hasta en tamaño ya que la foto solo se verá siempre en espacio reducido como imagen de perfil etc.

duilioisola 05-01-2023 18:05:23

Mira esto:

https://neftali.clubdelphi.com/redim...-antialiasing/

Casimiro Notevi 05-01-2023 18:51:38

También puedes guardar la imagen en un directorio, y en la BD solamente el enlace a la misma.

giantonti1801 05-01-2023 19:54:07

Cita:

Empezado por Casimiro Notevi (Mensaje 549832)
También puedes guardar la imagen en un directorio, y en la BD solamente el enlace a la misma.

es una muy buena idea solo que mi servidor esta en un vps solo tengo que investigar como guardar la imagen a en una carpeta y a su vez lidiar con los permisos y solucionado eso tengo que ver como consigo la sentencia para guardarlo y llamarlo desde la aplicacion, si alguien tiene alguna idea o ya a pasado por eso sera bien venidas sus sugerencias

Casimiro Notevi 05-01-2023 20:03:30

Eso es sencillo, hay diversas formas, por ejemplo, llamas a un script php en el servidor pasándole la imagen que quieres subir.
Código PHP:

<?php
  
// Recogemos el archivo enviado por el formulario
  
$filefirma $_FILES['filefirma']['name'];
  
$temp $_FILES['filefirma']['tmp_name'];   
  
// parámetro del subdirectorio de firmas, debe terminar con la barra /
  
$subdir trim($_REQUEST['subdir']);  
  
// y guardamos la firma.  
  
move_uploaded_file($temp$subdir $filefirma);  
?>


Casimiro Notevi 05-01-2023 20:12:33

Y desde tu programa delphi, algo así como esto:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  LHTTP: TIdHTTP;
  LIdMultipartFormData: TIdMultipartFormDataStream;
  LResponse: TMemoryStream;
  LEncoding: TEncoding;
begin
  LHTTP := TIdHTTP.Create;
  try
    LIdMultipartFormData := TIdMultipartFormDataStream.Create;
    try
      LIdMultipartFormData.AddFile('file', 'C:\ruta\a\tu\imagen.jpg', 'image/jpeg');
      LResponse := TMemoryStream.Create;
      try
        LHTTP.Post('http://tu-hosting.com/upload.php', LIdMultipartFormData, LResponse, LEncoding);
      finally
        LResponse.Free;
      end;
    finally
      LIdMultipartFormData.Free;
    end;
  finally
    LHTTP.Free;
  end;
end;

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

Cita:

Empezado por giantonti1801 (Mensaje 549830)
estoy guardando las imagen en MySQL en un campo BlobLong cada foro pesa como más de 3 MG.
...esto me está causando retrasos en las operaciones de la base de datos como consultas, inserciones etc...
...pero NO necesito que tenga buena resolución por lo que hay alguna forma de guardar esta imagen en una resolución reducida

Hay varias soluciones a este problema, dependiendo de los requisitos necesarios. Algunas ya te las han comentado otros compañeros.
  • Reducir tamaño de la imagen
  • Compromirla utilizando otros formatos
  • Dedidar una tabla relacionada sólo para las imágenes (aligera consultas, no inserciones)
  • Guardarlas fuera de la B.D. (discusión eterna de si es bueno o no...)
  • ...
No hay una genérica que sirva para todos los casos, depende de las necesidades.
En tu caso on esta frase: "NO necesito que tenga buena resolución" creo que ya te está marcando la solución más adecuada.

En ese caso, puedes revisar el artículo del blog:
https://neftali.clubdelphi.com/redim...-antialiasing/
Está la explicación de todo el proceso y la resolución de algunos problemas que te puedes encontrar.

Si buscas en los foros también encontrarás más hilos con código similar:
https://www.clubdelphi.com/foros/showthread.php?t=60685
https://www.clubdelphi.com/foros/showthread.php?t=15969
https://www.clubdelphi.com/foros/showthread.php?t=55265

giantonti1801 10-01-2023 11:04:03

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 549859)
Hay varias soluciones a este problema, dependiendo de los requisitos necesarios. Algunas ya te las han comentado otros compañeros.
  • Reducir tamaño de la imagen
  • Compromirla utilizando otros formatos
  • Dedidar una tabla relacionada sólo para las imágenes (aligera consultas, no inserciones)
  • Guardarlas fuera de la B.D. (discusión eterna de si es bueno o no...)
  • ...
No hay una genérica que sirva para todos los casos, depende de las necesidades.
En tu caso on esta frase: "NO necesito que tenga buena resolución" creo que ya te está marcando la solución más adecuada.

En ese caso, puedes revisar el artículo del blog:
https://neftali.clubdelphi.com/redim...-antialiasing/
Está la explicación de todo el proceso y la resolución de algunos problemas que te puedes encontrar.

Si buscas en los foros también encontrarás más hilos con código similar:
https://www.clubdelphi.com/foros/showthread.php?t=60685
https://www.clubdelphi.com/foros/showthread.php?t=15969
https://www.clubdelphi.com/foros/showthread.php?t=55265

Gracias amigo por tu respuesta. Créeme esta situación ya no me deja dormir y realmente paso a pensar que si existiera una solución no es fácil, Hasta lo momento lo que hice fue probar todas la soluciones que existen en la web atreves de la investigación y los foros, muchas de ellas fáciles y otras difíciles pero no logre echar andar a ninguna.
Probe la Solución de Neftalí: al ejecutar el código me daba un error "fuera de rango" pero poniendo algunas línea en comentarios logre echarlo a andar pero nunca lo probé en producción y el proceso de reducir el imagen era lento por lo que pensé que no se podía aplicar a mi proyecto ya que lo que me acelerara las consultas me demoraba la reducción de la imágenes.
Otras soluciones en internet tampoco pude echarlas a andar ya que en su mayoría debía colocarle en USES el componente JPEG y por alguna razón y no sé porque me daba una error.
Mi aplicación se desarrolló para móvil con una base de dato SQL SERVER en un VPS Hosting. dentro de todos los cambios que realice en la aplicación era que al principio la imagen se guardaba en la misma tabla que consultaba frecuentemente y eso hacía que el sistema fuera lento por lo que decidí crear una tabla para las imágenes y hacer un Joins pero aún persiste el problema. créeme amigo hasta ahora solo tengo 4 imágenes almacenada y me está dando problema no quiero imaginar cuando se carguen más imágenes.
mi Joins en la consulta:
Código Delphi [-]
procedure TForminicio.ListView1ItemClickEx(const Sender: TObject;
  ItemIndex: Integer; const LocalClickPos: TPointF;
  const ItemObject: TListItemDrawable);
begin
     if (ItemObject <> nil) and (ItemObject.Name = 'GlyphButton4') then
     begin
     UniQueryDetalleVisita.Close;
     UniQueryDetalleVisita.SQL.Clear;
     UniQueryDetalleVisita.SQL.text := 'select V.Rut__vis, V.Num_dep_Vis, V.Nom_Vis, V.Piso__Vis, V.Acept_Vis, V.Hora_in_vis, V.act_vis, V.cometario,  I.FOTO  from visitas V'+
                                       ' Inner Join IMG I on V.N_reg = I.REGISTRO and MODULO = ''VISITAS'' where Rut__Vis = :Rut__Vis and Num_dep_Vis = :Num_dep_Vis order by Hora_in_vis ';
     UniQueryDetalleVisita.ParamByName ('Rut__Vis').Asstring := label21.Text;
     UniQueryDetalleVisita.ParamByName ('Num_dep_Vis').asstring := LabelDepUs.Text;
     UniQueryDetalleVisita.Open;
     TabControl.ActiveTab :=   Tbl_DetalleVisitas;
    end
    else if (ItemObject <> nil) and (ItemObject.Name = 'GlyphButton5') then
    begin
    TabControl.ActiveTab := Tbl_Susp_Vis;
    Label31.Text :=  'Nombre: '+UniQueryDetalleVisitaNom_Vis.AsString+'';
    label32.Text :=  UniQueryDetalleVisitaRut__Vis.AsString;
    end
    else if (ItemObject <> nil) and (ItemObject.Name = 'Image3') then
    begin
        TabControl.ActiveTab := Tbl_Amp_IMG;
    end;
end;

También estoy obligado utilizar un listview y lo tengo enlazado con livebindings ya que he intentado de cualquier forma alimentar el listview en tiempo de ejecución pero no lo he podido hacer. a este punto ya yo creo que he probado de todo y sigo apuntando que mi problema son la imágenes. Imágenes esta que son tomada de la cámara de los dispositivos móvil por lo que imagino que cada una debe pasar los 6MB.

Si alguien tiene una alternativa o una solución porque sigo pensando que la mejor opción es reducir la resolución de la imagen en tiempo de ejecución.

Casimiro Notevi 10-01-2023 12:09:31

Si las imágenes las toman y las envían desde dispositivos móviles, deberías reducirlas en esos dispositivos antes de enviarlas.
Aparte de la resolución, también puedes reducirlas de tamaño.
No deberías tener ningún problema con ese tema de las imágenes, hoy en día es muy habitual su uso y su envío.
Tampoco es que podamos ayudar mucho si solamente nos indica que "da error", "no va", "no funciona", etc... deberías ser más explícito con cada problema para que sepamos a que atenernos.

giantonti1801 10-01-2023 12:22:44

Cita:

Empezado por Casimiro Notevi (Mensaje 549903)
Si las imágenes las toman y las envían desde dispositivos móviles, deberías reducirlas en esos dispositivos antes de enviarlas.
Aparte de la resolución, también puedes reducirlas de tamaño.
No deberías tener ningún problema con ese tema de las imágenes, hoy en día es muy habitual su uso y su envío.
Tampoco es que podamos ayudar mucho si solamente nos indica que "da error", "no va", "no funciona", etc... deberías ser más explícito con cada problema para que sepamos a que atenernos.

Acabo de Hacer una investigación me di cuenta que la imagen se está guardando en la base de datos como BMP y tiene una resolución de 1920*1080 pero si hay alguna opción de que se guarde en formato JPEG el peso pasa de 7 MB a 350KB pero como hacerlo?

la imagen se está guardando directamente de la cámara y yo creo que allí está el problema ya que la guarda como BITMAP
Código Delphi [-]
procedure TFormPrincipalTab.Timer_FINTimer(Sender: TObject);
var Image: TBitmap;
var bmp: TBitmap;
begin
  LabelCuentaRegresiva.Text := '0';
  Timer_N1.Enabled := false;
  LabelCuentaRegresiva.Visible := false;
  cancel := false;
  SetupSoundFoto('camara_51.mp3');
  PlaySoundFoto;
  {$IFDEF ANDROID}
  CameraComponent1.SampleBufferToBitmap(Image4.Bitmap, true);
  CameraComponent1.Active := false;
  {$ENDIF}
    begin
       if Label26.Text = 'InExistente' then
      begin
       LabelNumeroDpto.Text := labelDpto.Text;
       LabelNombreVis.Text := Edit1.Text;
        begin
        UniQueryVisitantesVal.Close;
        UniQueryVisitantesVal.SQL.Clear;
        UniQueryVisitantesVal.SQL.Add('INSERT INTO visitantes (Nom_Vis,Apell_Vis,Rut_Vis,Foto,Num_dep_Vis,Edif_vis,Estatus,Usuario_mod,)');           //
        UniQueryVisitantesVal.SQL.Add('VALUES (:Nom_Vis, :Apell_Vis, :Rut_Vis, :Foto, :Num_dep_Vis, :Edif_vis, :Estatus, :Usuario_mod, )');                      //,
        UniQueryVisitantesVal.ParamByName('Nom_vis').AsString := LabelNombreVis.text;
        UniQueryVisitantesVal.ParamByName('Rut_Vis').AsString := LabelRutVis.Text;
        UniQueryVisitantesVal.ParamByName('Num_dep_Vis').Asstring := LabelNumeroDpto.text;
        UniQueryVisitantesVal.ParamByName('Edif_vis').AsString := LabelEdificio.text;
        UniQueryVisitantesVal.ParamByName('Estatus').AsString := 'ACT';
        UniQueryVisitantesVal.ParamByName('Usuario_mod').Asstring := 'XXX';
        //UniQueryVisitantesVal.ParamByName('otro').Asstring := 'E';
        UniQueryVisitantesVal.ExecSQL;
            begin
            ////duda
            UniQueryIMG.Close;
            UniQueryIMG.SQL.Clear;
            UniQueryIMG.SQL.Add('UPDATE IMG SET FOTO = :FOTO, OTRO1 = :OTRO1, MODULO = :MODULO where OTRO1  = ''I'' and MODULO = ''VISITANTES''');
            UniQueryIMG.ParamByName('OTRO1').AsString := '';
            UniQueryIMG.ParamByName('FOTO').Assign(Image4.bitmap);
            UniQueryIMG.ExecSQL;
            end;

al agregar el jpeg en uses me da error de "f2063 could not compile used unit 'jpeg'"

Neftali [Germán.Estévez] 10-01-2023 12:42:00

Cuando haces esto:
Código Delphi [-]
UniQueryIMG.ParamByName('FOTO').Assign(Image4.bitmap);

Convierte antes la image del componente TImage a JPG o a PNG (ambos formatos con compresión).
Para eso puedes encontrar muchos códigos en los foros.

giantonti1801 10-01-2023 13:01:31

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 549905)
Cuando haces esto:
Código Delphi [-]
UniQueryIMG.ParamByName('FOTO').Assign(Image4.bitmap);

Convierte antes la image del componente TImage a JPG o a PNG (ambos formatos con compresión).
Para eso puedes encontrar muchos códigos en los foros.

Efectivamente pero debo cambiar el formato
Código Delphi [-]
UniQueryIMG.ParamByName('FOTO').Assign(Image4.jpeg);
o
UniQueryIMG.ParamByName('FOTO').Assign(Image4.picture);[/delphi]
para poder hacer eso debo colocar en el uses el 'JPEG' pero me da error al parecer no lo reconoce o me falta algun componente.


al agregar el jpeg en uses me da error de "f2063 could not compile used unit 'jpeg'"

Neftali [Germán.Estévez] 10-01-2023 13:24:33

Debes convertir la imagen que hay en el TImage.
Aquí tienes una función para hacerlo en FMX:
https://stackoverflow.com/questions/...eg-compression

giantonti1801 10-01-2023 13:50:37

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 549907)
Debes convertir la imagen que hay en el TImage.
Aquí tienes una función para hacerlo en FMX:
https://stackoverflow.com/questions/...eg-compression


cualquiera de los métodos que valla aplicar requiere que coloque en el uses el JPEG y es allí donde estoy teniendo problema (adjunto imagen de Error)

giantonti1801 10-01-2023 15:22:42

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 549907)
Debes convertir la imagen que hay en el TImage.
Aquí tienes una función para hacerlo en FMX:
https://stackoverflow.com/questions/...eg-compression

Como puedo aplicar este código a mi proyecto ya que la imagen la tengo en IMAGE1.BITMAP
Código Delphi [-]
var
  NewBitmap: TBitmap;
  MS1 : TMemoryStream;
  Surf: TBitmapSurface;
  JpgQuality : TBitmapCodecSaveParams;
begin
  NewBitmap := TBitmap.CreateFromFile('input.bmp');
  MS1 := TMemoryStream.Create;
  Surf := TBitmapSurface.create;

  try
    MS1.Position := 0;
    Surf.Assign(NewBitmap);
    JpgQuality.Quality := 100;

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

    MS1.SaveToFile('ouput.jpg');
  finally
    NewBitmap.Free;
    MS1.Free;
    Surf.Free;
  end;
end;

ya logre solucionar el problema que tenía con el JPEG tuve que agregar estos USES
Código Delphi [-]
System.ImageList, FMX.Surfaces

Casimiro Notevi 10-01-2023 16:51:21

Te aconsejo que para que ocupe menos la imagen la comprimas más, en lugar de:
Código Delphi [-]
JpgQuality.Quality := 100;
Puedes poner, ejemplo:
Código Delphi [-]
JpgQuality.Quality := 70;
En una imagen de 2560x1400 en jpg que ocupa 1,1 MB, si se guarda con compresión 70 entonces ocupa 171 KB





giantonti1801 10-01-2023 17:36:50

Me parece excelente pero donde coloco esta función en mi código?

Casimiro Notevi 10-01-2023 19:03:56

Cita:

Empezado por giantonti1801 (Mensaje 549912)
Me parece excelente pero donde coloco esta función en mi código?

Código Delphi [-]
var
  NewBitmap: TBitmap;
  MS1 : TMemoryStream;
  Surf: TBitmapSurface;
  JpgQuality : TBitmapCodecSaveParams;
begin
  NewBitmap := TBitmap.CreateFromFile('input.bmp');
  MS1 := TMemoryStream.Create;
  Surf := TBitmapSurface.create;

  try
    MS1.Position := 0;
    Surf.Assign(NewBitmap);
    JpgQuality.Quality := 100;   //   <<<-------------  ¡¡¡ AQUÍ !!!   ;)

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

    MS1.SaveToFile('ouput.jpg');
  finally
    NewBitmap.Free;
    MS1.Free;
    Surf.Free;
  end;
end;

giantonti1801 10-01-2023 22:53:41

Cita:

Empezado por Casimiro Notevi (Mensaje 549913)
Código Delphi [-]
var
  NewBitmap: TBitmap;
  MS1 : TMemoryStream;
  Surf: TBitmapSurface;
  JpgQuality : TBitmapCodecSaveParams;
begin
  NewBitmap := TBitmap.CreateFromFile('input.bmp');
  MS1 := TMemoryStream.Create;
  Surf := TBitmapSurface.create;

  try
    MS1.Position := 0;
    Surf.Assign(NewBitmap);
    JpgQuality.Quality := 100;   //   <<<-------------  ¡¡¡ AQUÍ !!!   ;)

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

    MS1.SaveToFile('ouput.jpg');
  finally
    NewBitmap.Free;
    MS1.Free;
    Surf.Free;
  end;
end;

No hay manera de hacerlo de esta forma. El problema radica que yo estoy tomando una con el dispositivo movil y lo estoy guardando un IMAGE1.BITMAP luego aunque en diversos intentos es tomar la foto ya convertida en el
Código Delphi [-]
MS1 := TMemoryStream.Create;
y pasarla a la base de datos pero no lo he logrado
Código Delphi [-]
uniQueryIMGFOTO.LoadFromStream(MS1);
esta puede ser mi única alternativa. hay que tomar en cuenta que todo se está realizando en un dispositivo movil Antroid/Ios.

Código Delphi [-]
procedure TFormPrincipalTab.Timer_FINTimer(Sender: TObject);
var
Image: TBitmap;
bmp: TBitmap;
NewBitmap: TBitmap;
MS1 : TMemoryStream;
Surf: TBitmapSurface;
JpgQuality : TBitmapCodecSaveParams;
begin
  LabelCuentaRegresiva.Text := '0';
  Timer_N1.Enabled := false;
  LabelCuentaRegresiva.Visible := false;
  cancel := false;
  SetupSoundFoto('camara_51.mp3');
  PlaySoundFoto;
  {$IFDEF ANDROID}
  CameraComponent1.SampleBufferToBitmap(Image4.Bitmap, true);
  CameraComponent1.Active := false;
  {$ENDIF}
  begin
   NewBitmap := image4.bitmap;//TBitmap.CreateFromFile('input.bmp');
   MS1 := TMemoryStream.Create;
   Surf := TBitmapSurface.create;
   try
   MS1.Position := 0;
   Surf.Assign(NewBitmap);
   JpgQuality.Quality := 70;
     if not TBitmapCodecManager.SaveToStream(MS1, Surf, '.jpg', @JpgQuality) then
     raise EBitmapSavingFailed.Create('Error saving Bitmap to jpg');
     MS1.SaveToFile('ouput.jpg');

       begin
          if Label26.Text = 'InExistente' then
            begin
             LabelNumeroDpto.Text := labelDpto.Text;
             LabelNombreVis.Text := Edit1.Text;
                begin
                UniQueryVisitantesVal.Close;
                UniQueryVisitantesVal.SQL.Clear;
                UniQueryVisitantesVal.SQL.Add('INSERT INTO visitantes (Nom_Vis,Apell_Vis,Rut_Vis,Foto,Num_dep_Vis,Edif_vis,Estatus,Usuario_mod,)');           //
                UniQueryVisitantesVal.SQL.Add('VALUES (:Nom_Vis, :Apell_Vis, :Rut_Vis, :Foto, :Num_dep_Vis, :Edif_vis, :Estatus, :Usuario_mod, )');                      //,
                UniQueryVisitantesVal.ParamByName('Nom_vis').AsString := LabelNombreVis.text;
                UniQueryVisitantesVal.ParamByName('Rut_Vis').AsString := LabelRutVis.Text;
                UniQueryVisitantesVal.ParamByName('Num_dep_Vis').Asstring := LabelNumeroDpto.text;
                UniQueryVisitantesVal.ParamByName('Edif_vis').AsString := LabelEdificio.text;
                UniQueryVisitantesVal.ParamByName('Estatus').AsString := 'ACT';
                UniQueryVisitantesVal.ParamByName('Usuario_mod').Asstring := 'TOTEM';
                //UniQueryVisitantesVal.ParamByName('otro').Asstring := 'E';
                UniQueryVisitantesVal.ExecSQL;
                   begin
                   UniQueryIMG.Close;
                   UniQueryIMG.SQL.Clear;
                   UniQueryIMG.SQL.Add('UPDATE IMG SET FOTO = :FOTO, OTRO1 = :OTRO1, MODULO = :MODULO where OTRO1  = ''I'' and MODULO = ''VISITANTES''');
                   UniQueryIMG.ParamByName('OTRO1').AsString := '';
                   UniQueryIMGFOTO.LoadFromFile('Ouput.jpg');
                   uniQueryIMGFOTO.LoadFromStream(MS1);
                   UniQueryIMG.ExecSQL;
                   end;

                      begin
                      UniQueryVisitasIngreso.Close;
                      UniQueryVisitasIngreso.SQL.Clear;
                      UniQueryVisitasIngreso.SQL.Add('INSERT INTO visitas (Nom_Vis,Apell_Vis,Rut__Vis,Foto,Num_dep_Vis,Piso__Vis,Edif_Vis,Hora_In_Vis, Num_Vis,Usuario_mod,otro)');           //
                      UniQueryVisitasIngreso.SQL.Add('VALUES (:Nom_Vis, :Apell_Vis, :Rut__Vis, :Foto, :Num_dep_Vis, :Piso__Vis, :Edif_Vis, :Hora_In_Vis, :Num_Vis, :Usuario_mod, :otro)');                      //,
                      UniQueryVisitasIngreso.ParamByName('Nom_vis').AsString := LabelNombreVis.text;
                      UniQueryVisitasIngreso.ParamByName('Rut__Vis').AsString := LabelRutVis.Text;
                      UniQueryVisitasIngreso.ParamByName('Num_dep_Vis').Asstring := LabelNumeroDpto.text;
                      UniQueryVisitasIngreso.ParamByName('Piso__Vis').AsString := LabelPisoINF.text;
                      UniQueryVisitasIngreso.ParamByName('Edif_Vis').AsString := LabelEdificio.text;
                      UniQueryVisitasIngreso.ParamByName('Hora_In_Vis').AsDateTime := Now;
                      UniQueryVisitasIngreso.ParamByName('Num_Vis').AsString := 'XXX';
                      UniQueryVisitasIngreso.ParamByName('Usuario_mod').Asstring := 'TOTEM';
                      UniQueryVisitasIngreso.ParamByName('otro').Asstring := 'E';
                      UniQueryVisitasIngreso.ExecSQL;
                      end;

                        begin
                        UniQueryIMG.Close;
                        UniQueryIMG.SQL.Clear;
                        UniQueryIMG.SQL.Add('UPDATE IMG SET FOTO = :FOTO, OTRO1 = :OTRO1 where OTRO1  = ''I'' and MODULO = ''VISITAS''');
                        UniQueryIMG.ParamByName('OTRO1').AsString := '';
                        uniQueryIMGFOTO.LoadFromStream(MS1);
                        UniQueryIMG.ExecSQL;
                        end;
                end;
             TabControl1.ActiveTab := TblEspera;
             LayoutEspera.Visible := true;
             FloatAnimation7.Enabled := true;
             Timer1.Enabled := true;
             Timer_fin.Enabled := false;
            end
      // end
            else
             begin
                LabelNumeroDpto.Text := labelDpto.Text;
                LabelNombreVis.Text := Edit1.Text;
                begin
                UniQueryVisitasIngreso.Close;
                UniQueryVisitasIngreso.SQL.Clear;
                UniQueryVisitasIngreso.SQL.Add('INSERT INTO visitas (Nom_Vis,Apell_Vis,Rut__Vis,Foto,Num_dep_Vis,Piso__Vis,Edif_Vis,Hora_In_Vis, Num_Vis,Usuario_mod,otro)');           //
                UniQueryVisitasIngreso.SQL.Add('VALUES (:Nom_Vis, :Apell_Vis, :Rut__Vis, :Foto, :Num_dep_Vis, :Piso__Vis, :Edif_Vis, :Hora_In_Vis, :Num_Vis, :Usuario_mod, :otro)');                      //,
                UniQueryVisitasIngreso.ParamByName('Nom_vis').AsString := LabelNombreVis.text;
                UniQueryVisitasIngreso.ParamByName('Rut__Vis').AsString := LabelRutVis.Text;
                UniQueryVisitasIngreso.ParamByName('Num_dep_Vis').Asstring := LabelNumeroDpto.text;
                UniQueryVisitasIngreso.ParamByName('Piso__Vis').AsString := LabelPisoINF.text;
                UniQueryVisitasIngreso.ParamByName('Edif_Vis').AsString := LabelEdificio.text;
                UniQueryVisitasIngreso.ParamByName('Hora_In_Vis').AsDateTime := Now;
                UniQueryVisitasIngreso.ParamByName('Num_Vis').AsString := 'XXX';
                UniQueryVisitasIngreso.ParamByName('Usuario_mod').Asstring := 'TOTEM';
                UniQueryVisitasIngreso.ParamByName('otro').Asstring := 'E';
                UniQueryVisitasIngreso.ExecSQL;
                  begin
                  UniQueryIMG.Close;
                  UniQueryIMG.SQL.Clear;
                  UniQueryIMG.SQL.Add('UPDATE IMG SET FOTO = :FOTO, OTRO1 = :OTRO1 where OTRO1  = ''I'' and MODULO = ''VISITAS''');
                  UniQueryIMG.ParamByName('OTRO1').AsString := '';
                  uniQueryIMGFOTO.LoadFromStream(MS1) ;
                  UniQueryIMG.ExecSQL;
                  end;
                end;
              TabControl1.ActiveTab := TblEspera;
              LayoutEspera.Visible := true;
              FloatAnimation7.Enabled := true;
              Timer1.Enabled := true;
              Timer_fin.Enabled := false;
              ColorAnimation1.Enabled := false;
             end;

       end;
    finally
    //NewBitmap.Free;  //Los estoy comentando ya que uno de los dos me esta dando problema cerrandome la aplicacion
    MS1.Free;
    //Surf.Free;       //Los estoy comentando ya que uno de los dos me esta dando problema cerrandome la aplicacion


   end;

  end;
end;

duilioisola 11-01-2023 08:32:49

Veo alguna cosa rara.
  • Quizás el error no es que no guarde la imagen comprimida sinó que "no guarde".
  • El Query está cerrado y estás modificando el valor de un campo.
  • Hay parámetros que no estás rellenando, por lo que puede ser que tengan valor nulo y por lo tanto no modifiquen ningún registro.

Código Delphi [-]
[...]
   UniQueryIMG.Close;
   UniQueryIMG.SQL.Clear;
   UniQueryIMG.SQL.Add('UPDATE IMG SET FOTO = :FOTO, OTRO1 = :OTRO1, MODULO = :MODULO where OTRO1  = ''I'' and MODULO = ''VISITANTES''');
   UniQueryIMG.ParamByName('OTRO1').AsString := '';

   { Aquí estás rellenando campos y no los parámetros del query.
     Por lógica se necesita rellenar los parámetros.
     Puede ser que el componente los rellene con el valor del campo, pero al estar cerrado el query no le veo la lógica.
     Incluso con algunos componentes te debería estar dando un error de "Dataset not in Edit or Insert mode" o algo parecido.
     Además lo estás haciendo dos veces y de forma diferente.
   UniQueryIMGFOTO.LoadFromFile('Ouput.jpg');
   uniQueryIMGFOTO.LoadFromStream(MS1);
   }
   UniQueryIMG.ParamByName('FOTO').LoadFromStream(MS1);
   {
   Quizás también deberías rellenar los parámetros :MODULO
   }
   UniQueryIMG.ParamByName('MODULO').As??? := ???;

   UniQueryIMG.ExecSQL;
[...]
   UniQueryIMG.Close;
   UniQueryIMG.SQL.Clear;
   UniQueryIMG.SQL.Add('UPDATE IMG SET FOTO = :FOTO, OTRO1 = :OTRO1 where OTRO1  = ''I'' and MODULO = ''VISITAS''');
   UniQueryIMG.ParamByName('OTRO1').AsString := '';

   { Aquí estás rellenando campos y no los parámetros del query
     Mismos comentarios que para el caso anterior
   uniQueryIMGFOTO.LoadFromStream(MS1);
   }
   UniQueryIMG.ParamByName('FOTO').LoadFromStream(MS1);

   UniQueryIMG.ExecSQL;


La franja horaria es GMT +2. Ahora son las 07:48:44.

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