Malen mit Licht: Langzeitbelichtung auf Android





Hallo allerseits, mein Name ist Dmitry und ich bin ein Android-Entwickler bei MEL Science. Heute möchte ich Ihnen sagen, wie Sie die Unterstützung für Langzeitbelichtung auf Smartphones implementieren können, damit das resultierende Bild direkt während des Erstellungsprozesses beobachtet werden kann. Und für Interessierte habe ich am Ende des Artikels einen Link zu einer Testanwendung vorbereitet, damit Sie selbst ein cooles Langzeitbelichtungsfoto machen können.





Langzeitbelichtung

Die Verschlusszeit ist ein Begriff aus der Welt der Fotografie, der die Zeit definiert, zu der der Verschluss beim Aufnehmen geöffnet wird. Je länger der Verschluss geöffnet ist, desto länger ist das Licht dem Lichtsensor ausgesetzt. Einfach ausgedrückt, macht es das Foto heller. Moderne Kameras verwenden Verschlusszeiten von 1/2000 Sekunden, wodurch Sie ein beleuchtetes, aber nicht überbelichtetes Foto erhalten. Eine lange Verschlusszeit bedeutet, dass der Verschluss mindestens eine Sekunde lang geöffnet wird. Mit der richtigen Szene ermöglicht dies fantastische Fotos, mit denen die Bewegung des Lichts durch das Kameraobjektiv erfasst werden kann. Darüber hinaus können Sie alles fotografieren: Nachtstraßen mit Rennwagen oder ein Pendel mit einer daran befestigten Taschenlampe, mit dem Sie Lissajous- Figuren zeichnen können . Oder Sie können selbst mit Licht malen und ganze Bilder und Fotos erhalten.





Stadtstraßen mit Langzeitbelichtung fotografiert
,

:





  • -





  • -





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



, . .





Langzeitbelichtung

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





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



Hier sind einige Beispiele mit unterschiedlichen Lichtabfallraten und -zeiten.
Quote 0,001
Quote 0,001
Koeffizient 0,01
Koeffizient 0,01
Gewinnchancen 0,5
Gewinnchancen 0,5

Fazit

Hier sind einige Beispiele dafür, was die resultierende Anwendung tun kann.  Immerhin bin ich kein Künstler: (Was wirst du zeichnen?
Hier sind einige Beispiele dafür, was die resultierende Anwendung tun kann. Immerhin bin ich kein Künstler: (Was wirst du zeichnen?

Das ist alles für heute. Für diejenigen, die es selbst ausprobieren möchten, finden Sie hier den vollständigen Anwendungscode und apk .








All Articles