<div dir="ltr"><div dir="ltr">Hi William,<div><br></div><div>Thank you for your work.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, 6 Jul 2022 at 11:18, David Plowman via libcamera-devel <<a href="mailto:libcamera-devel@lists.libcamera.org">libcamera-devel@lists.libcamera.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">From: William Vinnicombe <<a href="mailto:william.vinnicombe@raspberrypi.com" target="_blank">william.vinnicombe@raspberrypi.com</a>><br>
<br>
The exif tags are different between raw files from libcamera-apps and<br>
from Picamera2, causing issues loading data.<br>
<br>
Add code to identify which tags are being used, and then load the<br>
metadata from the correct tags.<br>
<br>
Signed-off-by: William Vinnicombe <<a href="mailto:william.vinnicombe@raspberrypi.com" target="_blank">william.vinnicombe@raspberrypi.com</a>><br></blockquote><div><br></div><div>Reviewed-by: Naushir Patuck <<a href="mailto:naush@raspberrypi.com">naush@raspberrypi.com</a>></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
---<br>
 utils/raspberrypi/ctt/ctt_image_load.py | 26 ++++++++++++++++++-------<br>
 1 file changed, 19 insertions(+), 7 deletions(-)<br>
<br>
diff --git a/utils/raspberrypi/ctt/ctt_image_load.py b/utils/raspberrypi/ctt/ctt_image_load.py<br>
index 934db123..29c17581 100644<br>
--- a/utils/raspberrypi/ctt/ctt_image_load.py<br>
+++ b/utils/raspberrypi/ctt/ctt_image_load.py<br>
@@ -301,17 +301,29 @@ def dng_load_image(Cam, im_str):<br>
         metadata.read()<br>
<br>
         Img.ver = 100  # random value<br>
-        Img.w = metadata['Exif.SubImage1.ImageWidth'].value<br>
+        """<br>
+        libcamera-apps create a separate Exif.Subimage1 for the picture<br>
+        picamera2 stores everything under Exif.Image<br>
+        this code detects which one is being used, and therefore extracts the correct values<br>
+        """<br>
+        try:<br>
+            Img.w = metadata['Exif.SubImage1.ImageWidth'].value<br>
+            subimage = "SubImage1"<br>
+            photo = "Photo"<br>
+        except KeyError:<br>
+            Img.w = metadata['Exif.Image.ImageWidth'].value<br>
+            subimage = "Image"<br>
+            photo = "Image"<br>
         Img.pad = 0<br>
-        Img.h = metadata['Exif.SubImage1.ImageLength'].value<br>
-        white = metadata['Exif.SubImage1.WhiteLevel'].value<br>
+        Img.h = metadata[f'Exif.{subimage}.ImageLength'].value<br>
+        white = metadata[f'Exif.{subimage}.WhiteLevel'].value<br>
         Img.sigbits = int(white).bit_length()<br>
         Img.fmt = (Img.sigbits - 4) // 2<br>
-        Img.exposure = int(metadata['Exif.Photo.ExposureTime'].value*1000000)<br>
-        Img.againQ8 = metadata['Exif.Photo.ISOSpeedRatings'].value*256/100<br>
+        Img.exposure = int(metadata[f'Exif.{photo}.ExposureTime'].value*1000000)<br>
+        Img.againQ8 = metadata[f'Exif.{photo}.ISOSpeedRatings'].value*256/100<br>
         Img.againQ8_norm = Img.againQ8 / 256<br>
         Img.camName = metadata['Exif.Image.Model'].value<br>
-        Img.blacklevel = int(metadata['Exif.SubImage1.BlackLevel'].value[0])<br>
+        Img.blacklevel = int(metadata[f'Exif.{subimage}.BlackLevel'].value[0])<br>
         Img.blacklevel_16 = Img.blacklevel << (16 - Img.sigbits)<br>
         bayer_case = {<br>
             '0 1 1 2': (0, (0, 1, 2, 3)),<br>
@@ -319,7 +331,7 @@ def dng_load_image(Cam, im_str):<br>
             '2 1 1 0': (2, (3, 2, 1, 0)),<br>
             '1 0 2 1': (3, (1, 0, 3, 2))<br>
         }<br>
-        cfa_pattern = metadata['Exif.SubImage1.CFAPattern'].value<br>
+        cfa_pattern = metadata[f'Exif.{subimage}.CFAPattern'].value<br>
         Img.pattern = bayer_case[cfa_pattern][0]<br>
         Img.order = bayer_case[cfa_pattern][1]<br>
<br>
-- <br>
2.30.2<br>
<br>
</blockquote></div></div>