Spanish REDUCIR RESOLUCION IMAGENES

JAVIERGARCIA

Member
Licensed User
Longtime User
Hola, Buenas tardes.

Intento bajar la resolución de una imagen que capto con este procedimiento, pero no veo bien como hacerlo.

Después de realizada la foto, la subo vía ftp a servidor, pero claro, depende como, esta puede ser de 10 megas o más, según como tenga cada uno configurado su móvil.

Que hago entonces, le digo desde la app que me haga las fotos como quiera, o bajo después la resolución. Cualquiera me es válida.
Solo quiero no cargar el servidor excesivamente.


Sub camera(Directory As String, PictureName As String)
Dim i As Intent
onoff = True
i.Initialize("android.media.action.IMAGE_CAPTURE", "" )
i.PutExtra("crop", "true") 'crop ON
i.PutExtra("aspectX", 0) 'crop aspects
i.PutExtra("aspectY", 0) 'crop aspects
i.PutExtra("outputX", 200) 'crop size
i.PutExtra("outputY", 150) 'crop size
i.PutExtra("output", ParseUri("file://" & File.Combine(Directory, PictureName))) 'output folder you set OpenCam(File.DirRootExternal, "1.jpg")

StartActivity(i)
End Sub


Cómo podría hacerlo?

Muchas gracias.
 

JoanRPM

Active Member
Licensed User
Longtime User
Yo hago lo siguiente:

B4X:
Sub CreateScaledBitmap(Original As Bitmap, NewWidth As Int, NewHeight As Int) As Bitmap
    Dim r As Reflector
    Dim Bitmap1 As Bitmap

    Bitmap1 = r.RunStaticMethod("android.graphics.Bitmap", "createScaledBitmap", _
        Array As Object(Original, NewWidth, NewHeight, True), _
        Array As String("android.graphics.Bitmap", "java.lang.int", "java.lang.int", "java.lang.boolean"))
    Return Bitmap1
End Sub

Luego llamo a la rutina:

B4X:
        'redimensiona el BMP a 169 x 127 pixels y lo salva a Foto1LR
    Dim Bitmap1 As Bitmap
    Bitmap1.Initialize(File.DirDefaultExternal,"Foto1.jpg")
    SaveBitmap(File.DirDefaultExternal, "Foto1LR.jpg", CreateScaledBitmap(Bitmap1, 169, 127))

Y ya tienes guardada la imagen redimensionada.
Saludos.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Javier

Con lo que te ha dado JoanRPM ya puedes redimensionar, el único problema es que tu al hacer una foto no sabes que tamaño ha seleccionado el usuario por defecto (estás empleando el dispositivo cámara), tampoco sabes si ha echo la foto en vertical, horizontal, etc . Por lo tanto si redimensionas a "piñon fijo" te saldrá la imagen mal.
Te pongo un codigo que tiene en cuenta todo eso.
Por otro lado, si antes de enviar esa foto la quieres visualizar, tendrias que mirar el código EXIF de como ha sido tomada la foto (los grados), y girarla (si lo requiere) para que quede recta. En este foro creo recordar que hay una rutina para eso, si no creas un nuevo post y alguno contestaremos.
De regalo te pongo un código por si quieres cambiar la calidad de la foto ;), asi tambien bajarás su peso.

La secuencia de hacer una foto es la siguiente:
- Llamas a abrir la aplicación de la cámara
- Entra en el evento de la cámara
- Activity se va a Pause, UserClosed = false
- Cuando hagas la foto o canceles el hacer la foto, Activity va a Resume, de ahí de capturar la foto en Resume y de borrarla antes de hacer una nueva.
- Creas la imagen con medidas, calidad y giro para enviar

B4X:
Sub Process_Globals
Dim FlagCamaraAccionada As Boolean
Dim DirTMPFoto = "Nombre de la carpeta para fotos"  as String
Dim AnchoImagenEnvio As Double
Dim AltoImagenEnvio As Double
Dim IndiceCalidadImagen As Int
Dim IndiceTamañoImagen As Int


' ...............
' ...............
' ...............



' ---------- Desde donde llames a hacer la foto --------------
' Borro la foto anterior ' si la quieres conservar cambiala de sitio
Try
    File.Delete(DirTMPFoto,"foto.jpg")
  Catch
  End Try

  IndiceCalidadImagen = 1 ' 100%
  IndiceTamañoImagen = 2 ' Mediano
  FlagCamaraAccionada = True
  AbrirAplicacionCamara(DirTMPFoto, "foto.jpg")
' -----------------------------------------------------------


Sub AbrirAplicacionCamara(Directorio As String, NombreImagen As String)

Dim i As Intent

Try
i.Initialize("android.media.action.IMAGE_CAPTURE", "")
i.PutExtra("output", EventoCamara("file://" & File.Combine(Directorio, NombreImagen)))
StartActivity(i)
Catch
  'Error al iniciar la cámara
  FlagCamaraAccionada = False
  ' Puedes dar un mensaje de error
End Try

End Sub

Sub EventoCamara(FileName As String) As Object

Dim r As Reflector
Return r.RunStaticMethod("android.net.Uri", "parse", Array As Object(FileName), Array As String("java.lang.String"))

End Sub

Sub Activity_Resume

If FlagCamaraAccionada Then
   FlagCamaraAccionada= False
   If File.Exists(DirTMPFoto,"foto.jpg") Then CrearImagenRectaParaEnvio
End If

End Sub


Sub CrearImagenRectaParaEnvio
' se crea la imagen recta para enviarla
Dim calidad As Int
Dim TamañoMaximoImagen As Int
Dim XdivY As Double

Dim Bitmap1 As Bitmap

Try
  Bitmap1.Initialize(DirTMPFoto,"foto.jpg")
Catch
  ' No se pudo cargar la Imagen
  Log("CrearImagenRectaParaEnvio error Bitmap1 No se pudo cargar la Imagen de la foto")
  Return
End Try

AnchoImagenEnvio = Bitmap1.Width
AltoImagenEnvio = Bitmap1.Height

' puedes crear la calidad de imagen que quieras
Select Case IndiceCalidadImagen
  Case 1
    calidad = 100 ' original
  Case 2
    calidad = 50 ' media
  Case 3
    calidad = 25 ' pequeña
End Select



' tamaño de la imagen en Pixel, puedes decirle el tamaño máximo que vas a crear de la imagen
' No le pasas ancho y alto, solo el tamaño máximo, el alto y ancho será proporcional a la foto realizada
Select Case IndiceTamañoImagen
  Case 1
  ' Grande
  TamañoMaximoImagen = 2048
Case 2
  ' Mediano
  TamañoMaximoImagen = 1536
Case 3
  ' Pequeño
  TamañoMaximoImagen = 1024
End Select

  ' calculo proporcion con los tamaños seleccionados
    XdivY = AnchoImagenEnvio / AltoImagenEnvio
    If XdivY >= 1 Then
      ' mas ancho que alto
      AnchoImagenEnvio = TamañoMaximoImagen
      AltoImagenEnvio = AnchoImagenEnvio / XdivY
    Else
      ' mas alto que ancho
      AltoImagenEnvio = TamañoMaximoImagen
      AnchoImagenEnvio = AltoImagenEnvio * XdivY
    End If

Log("IndiceTamañoImagen " & IndiceTamañoImagen )
Log("AnchoImagenEnvio " & AnchoImagenEnvio & " AltoImagenEnvio " & AltoImagenEnvio)


If AnchoImagenEnvio>0 And AltoImagenEnvio>0 Then
   ' reescalo
   Bitmap1=CrearBitmapEscalado(Bitmap1,AnchoImagenEnvio,AltoImagenEnvio)
End If

' ---------------- solo si se va a visualizar o quieres enviar la imagen recta --------------
Dim grados As Float
grados=ExtraerGradosDelEXIF(DirTMPFoto,"foto.jpg")
If grados> 0 Then
  ' Girar Imagen
End If
' --------------------------------------------------------

' se salva la imagen con nueva calidad y giro ' si no lo usas quitalo
Dim out As OutputStream
Try
  NombreImagenParaEnviar = "fotoOK.jpg" ' cuidado si se va a enviar varias muy seguidas hay que cambiar el nombre, se puede poner fecha y hora
  out = File.OpenOutput(DirmTMPFoto ,NombreImagenParaEnviar, False) ' aqui pondria un directorio de fotos a enviar, en vez de emplear el mismo
  Bitmap1.WriteToStream (out,calidad,"JPEG")
  out.Close
Catch
  Log("CrearImagenRectaParaEnvio error Bitmap1 No se pudo crear la Imagen final")
End Try



' descargar memoria
Bitmap1 = DescargarMemoriadeImagen(Bitmap1) ' crear un sub para descargar los bitmap, si se hacen muchas fotos cargamos la RAM

' AQUI ENVIAS

End sub

Sub CrearBitmapEscalado(Original As Bitmap, NewWidth As Int, NewHeight As Int) As Bitmap
  Dim r As Reflector

  Try
  BitmapReescalar = r.RunStaticMethod("android.graphics.Bitmap", "createScaledBitmap", _
  Array As Object(Original, NewWidth, NewHeight, False), _
  Array As String("android.graphics.Bitmap", "java.lang.int", "java.lang.int", "java.lang.boolean"))
   Catch
    Log("Error CrearBitmapEscalado")
     Return Original
   End Try

   Return BitmapReescalar
End Sub

Saludos
 
Last edited:

JAVIERGARCIA

Member
Licensed User
Longtime User
Vaya,,, probado y ok.
Nivelazos, si señor. (que todo eso me sirva para aprender más y algún día poder ayudar yo a otros también).

bueno,,, va, día, hora y lugar???
A mediodia el cocidín maragato y a la noche una fabadita, a los dos, JoanRPM-Bgsoft


Saludos
 

Attachments

  • Faba2-1024x680.jpg
    Faba2-1024x680.jpg
    156.4 KB · Views: 357

JoanRPM

Active Member
Licensed User
Longtime User
Vaya pinta que tiene esta mesa!
Nada, para esto estamos, para ayudar. A mi también me ayudan.

Buen provecho.

PD. De paso puedes poner, en el título, que ya está solucionado.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Javier

Creo que a Joan y a mi el dia y la hora nos da igual, el lugar a poder ser en algun sitio de Barcelona :D , los cafés y las copas ya las pagamos nosotros ;)

Me alegro que te funcione, aunque uno sepa poco, siempre se puede ayudar a otro que sabe menos o simplemente que no ha realizado algo concreto en B4A , y para empezar a ayudar podrias como te ha dicho Joan añadir a la cabecera del post [SOLUCIONADO] y con eso ya ayudas al resto del foro a saber que tu pregunta de solucionó, y así cuando alguien busque sabrá que hay una solución y asi evita estar entrando y saliendo de los post, de esta forma hacemos el foro mas agil. Tambien ayuda dar un Like a una respuesta que te ha solucionado un problema :D , es la única recompensa que tienen los que ayudan sin mas, simplemente por el echo de ayudar.

Saludos
 

mvera

Active Member
Licensed User
Longtime User
hola creo que estoy buscando lo mismo JAVIERGARCIA.

la diferencia es que yo tengo menos experiencia e intente probar los código y no me funcionaron.

tendrán por ahí un ejemplo pequeño para descargar , se los agradecería mucho.

saludos.
 
Top