みなさん、こんにちは。私の名前はDmitryで、MELScienceのAndroid開発者です。今日は、スマートフォンで長時間露光のサポートを実装して、作成の過程で結果の画像を観察できるようにする方法を説明したいと思います。そして、興味のある人のために、記事の最後に、テストアプリケーションへのリンクを用意しました。これにより、あなた自身がクールな長時間露光写真を撮ることができます。
長期露出
シャッタースピードは、撮影時にシャッターが開く時間を定義する写真の世界からの用語です。シャッターが開いている時間が長いほど、光が光センサーにさらされる時間が長くなります。簡単に言えば、写真を明るくします。最新のカメラは1/2000秒のシャッター速度を使用しているため、露出オーバーの写真ではなく、照らされた写真を撮ることができます。シャッタースピードが遅いとは、シャッターを1秒以上開くことを意味します。適切なシーンで、これにより、カメラのレンズを通して光の動きを捉えることができる素晴らしい写真が可能になります。さらに、レーシングカーのある夜の街並みや懐中電灯が付いた振り子など、何でも写真を撮ることができ、 リサージュ図形を描くことができます。または、自分で光でペイントして、全体の写真や写真を取得することもできます。
:
-
-
- . - . - 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()}")
}
.
, .
, .
.
, 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;
//
}
:
.
, , - “ ”. , , , . , , .. , .
. . . , .
:
if (newBrightness > oldBrightness) {
gl_FragColor = color;
} else {
gl_FragColor = oldColor;
}
, . .
, .. ! - , , ? . - . . ( , - ).
if (newBrightness > oldBrightness) {
gl_FragColor = mix(color, oldColor, 0.01);
} else {
gl_FragColor = mix(oldColor, color, 0.01);
}
これは、光の減衰率と時間が異なるいくつかの例です。
結論
それが今日のすべてです。自分で試してみたい人のために、完全なアプリケーションコードとapkはここにあります。