AndroidスマホでRAWファイル対応のカメラがあるだけでもありがたいものです。大半のカメラが出力するのは、せいぜいJPEGかPNGです。解像度が高くなるにつれて、ファイルサイズはだいたい4MBからになります。
なぜ撮影時にAVIF/HEIC/HEIFなどの高効率フォーマットで保存できないのでしょうか。将来的には対応するかもしれませんが、AVIFはHEICより新しく、より魅力的です。
それまでは、Termuxのカメラ機能で少し遊んでみましょう。JPEGで撮影したあと、その場でほぼロスレスのAVIFに変換します。
これは主役の北上を、Sony標準カメラで撮ったものです。
Termuxをインストールし、Termux APIもインストールします。続いてtermux-apiとImage Magickパッケージをインストールします。
pkg update
pkg install termux-api imagemagicktermux-camera-infoコマンドを使ってカメラ情報を確認します。JSONが出力され、スマホ上のレンズIDが示されるはずです。たとえば私の端末には前面カメラ1個 + 背面カメラ3個があり、ID 0〜4に対応しています。
[
{
"id": "0",
"facing": "back",
"jpeg_output_sizes": [
{
"width": 4032,
"height": 3024
},
],
"focal_lengths": [
5.110000133514404
]
},
{
"id": "1",
"facing": "front",
"jpeg_output_sizes": [
{
"width": 3264,
"height": 2448
},
],
"focal_lengths": [
2.4700000286102295
]
},
{
"id": "2",
"facing": "back",
"jpeg_output_sizes": [
{
"width": 4032,
"height": 3024
}
],
"focal_lengths": [
5.110000133514404
]
},
{
"id": "3",
"facing": "back",
"jpeg_output_sizes": [
{
"width": 4288,
"height": 3216
}
],
"focal_lengths": [
6.949999809265137
]
},
{
"id": "4",
"facing": "back",
"jpeg_output_sizes": [
{
"width": 4032,
"height": 3024
},
],
"focal_lengths": [
2.6700000762939453
]
}
]TermuxにはGUIがないのに、どうやって写真を撮るのか。ポーズを決めて勘で撮るしかありません。レンズごとのだいたいの写りを見たい場合は、OpenCameraをダウンロードしてレンズを切り替えれば確認できます。
次は撮影コマンドです。Termuxがカメラ(-cの後ろにレンズIDを指定)を呼び出してjpeg形式の写真を出力します。他に調整できるオプションはありません。そのファイルをImage Magickに渡してAVIFへ変換します。最後のコマンドはjpegを削除します。
termux-camera-photo -c 0 temp.jpeg && magick convert temp.jpeg -quality 90 out.avif && rm temp.jpeg撮影時にはレンズの作動音が聞こえることがあり、Android 12ではカメラへのアクセス表示も出ます。変換には約10秒かかります。
撮影後、Termuxのホームディレクトリからファイルを取り出すと、JPEG(左)をAVIF(右)へ変換した後、容量が半分以下になっていることがわかります。(注:私のスマホではAVIFのカラーマッピングが少しおかしく、Linuxパソコンで見ると正確に表示されます)
3番の広角レンズで試してみると、また違った味わいがあります。
もちろん、Appleが使っているHEICへ変換することもできます。ただし、その場合は逆にファイルサイズが大きくなりますXD。
こんなに面倒なら、普通に写真を撮ってからまとめて変換すればいいのでは?その通りです。画像・動画をAVIF / AVIFSへコマンドラインで変換する方法を見てください。
