Pintar con luz: exposición prolongada en Android





Hola a todos, mi nombre es Dmitry y soy desarrollador de Android en MEL Science. Hoy quiero contarles cómo se puede implementar la compatibilidad con la exposición prolongada en los teléfonos inteligentes, para que la imagen resultante se pueda observar justo en el proceso de creación. Y para aquellos interesados, al final del artículo, preparé un enlace a una aplicación de prueba, para que puedan tomar una foto genial con una larga exposición.





Exposición prolongada

La velocidad del obturador es un término del mundo de la fotografía que define el tiempo que se abre el obturador al disparar. Cuanto más tiempo esté abierto el obturador, más tiempo estará expuesta la luz al sensor de luz. En pocas palabras, hace que la foto sea más brillante. Las cámaras modernas utilizan velocidades de obturación de 1/2000 segundos, lo que le permite obtener una fotografía iluminada, pero no sobreexpuesta. Una velocidad de obturación lenta significa abrir el obturador durante un segundo o más. Con la escena correcta, esto produce fotografías fantásticas capaces de capturar el movimiento de la luz a través del lente de la cámara. Además, puede tomar fotografías de cualquier cosa: calles nocturnas con autos de carreras o un péndulo con una linterna adjunta, lo que le permite dibujar figuras de Lissajous. O puede pintar con luz usted mismo y obtener imágenes completas, fotografías.





Calles de la ciudad fotografiadas con larga exposición
,

:





  • -





  • -





- . - . - Android 30 .





.





API CameraX. . OpenGL ES . , , .









, usecase . , .





, Camera2Interop , Camera2API. , .. .





val imageCaptureBuilder = ImageCapture.Builder()
Camera2Interop.Extender(imageCaptureBuilder).apply {  
  setCaptureRequestOption(
    CaptureRequest.CONTROL_AE_MODE,
    CaptureRequest.CONTROL_AE_MODE_OFF
  )
  setCaptureRequestOption(
    CaptureRequest.SENSOR_EXPOSURE_TIME,
    EXPOSURE_TIME_SEC * NANO_IN_SEC
  )
}
      
      



, , cameraCharacteristics







val manager = getSystemService(CAMERA_SERVICE) as CameraManager
for (cameraId in manager.cameraIdList) {
  val chars = manager.getCameraCharacteristics(cameraId)
  val range = chars.get(CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE)  
  Log.e("CameraCharacteristics", "Camera $cameraId range: ${range.toString()}")
}
      
      







.





  1. , .





  2. , .





  3. .





, . . , . 





, 2 : . .





#extension GL_OES_EGL_image_external : require
precision mediump float;
uniform mat4 stMatrix;
uniform texType0 tex_sampler;
uniform texType1 old_tex_sampler;
varying vec2 v_texcoord;
void main() {    
    vec4 color = texture2D(tex_sampler, (stMatrix * vec4(v_texcoord.xy, 0, 1)).xy);
    vec4 oldColor = texture2D(old_tex_sampler, v_texcoord);  
    float oldBrightness = oldColor.r * 0.2126 + oldColor.g * 0.7152 + oldColor.b * 0.0722 + oldColor.a; 
    float newBrightness = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722 + color.a;
  //  
}
      
      



:





  1. .













, , - “ ”. , , , . , , .. , . 





. . . , .





:





if (newBrightness > oldBrightness) {
  gl_FragColor = color;
} else {
  gl_FragColor = oldColor;
}
      
      



, . .





Exposición prolongada

, .. ! - , , ? . - . . ( , - ).  





if (newBrightness > oldBrightness) {  
  gl_FragColor = mix(color, oldColor, 0.01);
} else { 
  gl_FragColor = mix(oldColor, color, 0.01);
}
      
      



A continuación, se muestran algunos ejemplos con diferentes velocidades y tiempos de caída de la luz.
Cuotas 0.001
Cuotas 0.001
Coeficiente 0.01
Coeficiente 0.01
Cuotas 0.5
Cuotas 0.5

Conclusión

A continuación, se muestran algunos ejemplos de lo que puede hacer la aplicación resultante.  Después de todo, no soy un artista: (¿Qué dibujarás?
A continuación, se muestran algunos ejemplos de lo que puede hacer la aplicación resultante. Después de todo, no soy un artista: (¿Qué dibujarás?

Eso es todo por hoy. Para aquellos que deseen probar el código completo de la aplicación y el apk, se pueden encontrar aquí .








All Articles