Peindre avec la lumière: longue exposition sur Android





Bonjour à tous, je m'appelle Dmitry et je suis développeur Android chez MEL Science. Aujourd'hui, je veux vous dire comment vous pouvez mettre en œuvre la prise en charge de la longue exposition sur les smartphones, afin que l'image résultante puisse être observée dès le processus de création. Et pour ceux qui sont intéressés, à la fin de l'article, j'ai préparé un lien vers une application de test - afin que vous puissiez vous-même prendre une photo longue exposition.





Longue exposition

La vitesse d'obturation est un terme du monde de la photographie qui définit l'heure d'ouverture de l'obturateur lors de la prise de vue. Plus l'obturateur est ouvert longtemps, plus la lumière est exposée longtemps au capteur de lumière. En termes simples, cela rend la photo plus lumineuse. Les appareils photo modernes utilisent des vitesses d'obturation de 1/2000 seconde, ce qui vous permet d'obtenir une photo éclairée, mais pas surexposée. Une vitesse d'obturation lente signifie ouvrir l'obturateur pendant une seconde ou plus. Avec la bonne scène, cela permet des photographies fantastiques capables de capturer le mouvement de la lumière à travers l'objectif de la caméra. De plus, vous pouvez prendre des photos de n'importe quoi: des rues nocturnes avec des voitures de course ou un pendule avec une lampe de poche attachée, vous permettant de dessiner des personnages de Lissajous. Ou vous pouvez peindre vous-même avec de la lumière et obtenir des images complètes, des photographies.





Les rues de la ville photographiées à l'aide d'une longue exposition
,

:





  • -





  • -





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



, . .





Longue exposition

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





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



Voici quelques exemples avec différents taux et temps de décroissance de la lumière.
Cotes 0,001
Cotes 0,001
Coefficient 0,01
Coefficient 0,01
Cotes 0.5
Cotes 0.5

Conclusion

Voici quelques exemples de ce que l'application résultante peut faire.  Après tout, je ne suis pas un artiste: (que vas-tu dessiner?
Voici quelques exemples de ce que l'application résultante peut faire. Après tout, je ne suis pas un artiste: (que vas-tu dessiner?

C'est tout pour aujourd'hui. Pour ceux qui veulent l'essayer eux-mêmes, le code complet de l'application et l'apk peuvent être trouvés ici .








All Articles