Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Desarrollo en Delphi para Android
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-01-2023
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 05-01-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Mira esto:

https://neftali.clubdelphi.com/redim...-antialiasing/
Responder Con Cita
  #3  
Antiguo 05-01-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
También puedes guardar la imagen en un directorio, y en la BD solamente el enlace a la misma.
Responder Con Cita
  #4  
Antiguo 05-01-2023
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
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
Responder Con Cita
  #5  
Antiguo 05-01-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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);  
?>
Responder Con Cita
  #6  
Antiguo 05-01-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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;
Responder Con Cita
  #7  
Antiguo 09-01-2023
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por giantonti1801 Ver Mensaje
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
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 10-01-2023
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
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.

Última edición por giantonti1801 fecha: 10-01-2023 a las 11:15:28.
Responder Con Cita
  #9  
Antiguo 10-01-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #10  
Antiguo 10-01-2023
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
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'"

Última edición por giantonti1801 fecha: 10-01-2023 a las 12:37:14.
Responder Con Cita
  #11  
Antiguo 10-01-2023
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #12  
Antiguo 10-01-2023
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
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'"
Responder Con Cita
  #13  
Antiguo 10-01-2023
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Debes convertir la imagen que hay en el TImage.
Aquí tienes una función para hacerlo en FMX:
https://stackoverflow.com/questions/...eg-compression
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #14  
Antiguo 10-01-2023
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
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)

Última edición por giantonti1801 fecha: 29-03-2023 a las 20:43:36.
Responder Con Cita
  #15  
Antiguo 10-01-2023
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
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
Responder Con Cita
  #16  
Antiguo 10-01-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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




Responder Con Cita
  #17  
Antiguo 10-01-2023
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
Me parece excelente pero donde coloco esta función en mi código?

Última edición por Casimiro Notevi fecha: 10-01-2023 a las 19:02:38.
Responder Con Cita
  #18  
Antiguo 10-01-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por giantonti1801 Ver Mensaje
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;
Responder Con Cita
  #19  
Antiguo 10-01-2023
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
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, tro)');                      //,
                      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, tro)');                      //,
                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;
Responder Con Cita
  #20  
Antiguo 11-01-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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;
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Reducir tamaño de imagen en TImage capo979 Gráficos 1 12-01-2009 17:29:59
Reducir el tamaño de una imagen pablopessoa Varios 6 11-10-2008 13:18:40
Resolución de una imagen icsoft Gráficos 4 23-07-2008 11:08:17
Resolucion de una imagen en reportBuilder trashky Impresión 2 08-05-2006 10:00:03
Reducir tamaño de imagen de un dbimage Walterdf Gráficos 4 11-11-2004 14:20:33


La franja horaria es GMT +2. Ahora son las 15:16:10.


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
Copyright 1996-2007 Club Delphi