Il semble que ce soit déjà possible, avec le firmware stock ! J'étais sur le point d'essayer de tracer une application caméra alimentée par NDK (merci à Tutoriel de Sisik avec une démonstration ) avec strace
pour voir quels appels d'API mènent à quels ioctl
pour faciliter les recherches ultérieures, quand, en réduisant la démo, j'ai remarqué que l'API native de la caméra exposait AIMAGE_FORMAT_RAW16
avec des dimensions 4144×3106 sur mon Galaxy SM-A320F/DS. Après avoir essayé de capturer une image dans ce format, j'ai obtenu une véritable sortie Bayer 16 bits, qui, après un démosaïquage simpliste et un équilibrage des blancs, a donné une image brute assez décente.
Il y a cependant une petite bizarrerie : la partie inférieure de l'image (pixels 2333 à 3106) est toujours remplie de zéros. Je ne sais pas trop pourquoi, mais au moins les 75% supérieurs des données sont présents et utilisables.
Comment obtenir le support RAW dans OpenCamera
Actuellement, OpenCamera détecte si une caméra supporte le RAW en REQUEST_AVAILABLE_CAPABILITIES_RAW
. S'il n'y a pas cette capacité, la détection donne simplement un résultat négatif. Pour le SM-A320F, ce résultat est incorrect, car il ne signale pas cette capacité, mais le format RAW16 fait partie des formats de sortie pris en charge.
Pour contourner cette erreur de détection, nous pouvons appliquer le patch suivant à OpenCamera 1.47.3, et construire notre propre APK. Ce patch ne vérifiera pas la capacité, et OpenCamera recherchera le format désiré dans tous les cas.
diff --git a/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java b/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java
index 2c6463c..939b00b 100644
--- a/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java
+++ b/app/src/main/java/net/sourceforge/opencamera/cameracontroller/CameraController2.java
@@ -2062,7 +2062,7 @@ public class CameraController2 extends CameraController {
//camera_features.picture_sizes.get(0).supports_burst = false;
raw_size = null;
- if( capabilities_raw ) {
+ if( true || capabilities_raw ) {
android.util.Size [] raw_camera_picture_sizes = configs.getOutputSizes(ImageFormat.RAW_SENSOR);
if( raw_camera_picture_sizes == null ) {
if( MyDebug.LOG )
J'ai signalé ce problème sur le site de suivi des problèmes d'OpenCamera en tant que billet 661 .