Melukis dengan Cahaya: Pencahayaan Panjang di Android





Halo semuanya, nama saya Dmitry dan saya adalah pengembang Android di MEL Science. Hari ini saya ingin memberi tahu Anda bagaimana Anda dapat menerapkan dukungan untuk eksposur lama pada ponsel cerdas, sehingga gambar yang dihasilkan dapat diamati langsung dalam proses pembuatannya. Dan bagi mereka yang tertarik, di akhir artikel, saya menyiapkan tautan ke aplikasi pengujian - sehingga Anda sendiri dapat mengambil foto eksposur panjang yang keren.





Eksposur panjang

Shutter speed merupakan istilah dari dunia fotografi yang mendefinisikan waktu buka shutter saat memotret. Semakin lama rana dibuka, semakin lama cahaya terpapar ke sensor cahaya. Sederhananya, ini membuat foto menjadi lebih cerah. Kamera modern menggunakan kecepatan rana 1/2000 detik, yang memungkinkan Anda mendapatkan foto yang diterangi, tetapi tidak terlalu terang. Kecepatan rana lambat berarti membuka rana selama satu detik atau lebih. Dengan pemandangan yang tepat, ini memungkinkan foto-foto fantastis yang mampu menangkap pergerakan cahaya melalui lensa kamera. Selain itu, Anda dapat mengambil gambar apa saja: jalan-jalan malam dengan mobil balap atau pendulum dengan senter yang terpasang, memungkinkan Anda menggambar sosok Lissajous. Atau Anda bisa melukis diri sendiri dengan cahaya dan mendapatkan seluruh gambar, foto.





Jalan-jalan kota difoto menggunakan pencahayaan lama
,

:





  • -





  • -





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



, . .





Eksposur panjang

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





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



Berikut adalah beberapa contoh dengan tingkat dan waktu peluruhan cahaya yang berbeda.
Kemungkinan 0,001
Kemungkinan 0,001
Koefisien 0,01
Koefisien 0,01
Kemungkinan 0,5
Kemungkinan 0,5

Kesimpulan

Berikut beberapa contoh yang dapat dilakukan oleh aplikasi yang dihasilkan.  Lagipula, saya bukan seorang seniman: (Apa yang akan kamu gambar?
Berikut beberapa contoh yang dapat dilakukan oleh aplikasi yang dihasilkan. Lagipula, saya bukan seorang seniman: (Apa yang akan kamu gambar?

Sekian untuk hari ini. Bagi yang ingin mencobanya sendiri, kode aplikasi dan apk lengkapnya bisa dilihat disini .








All Articles