from cronomaxrf import read_datasets, get_array
How about the images?
In the previous sections we were able to read the spectral data from the native Crono HDF5 file. However, besides spectra the Crono instrument seems to capture color images at each spectrum location. I was not able to extract these images yet, because it is unclear how their binary data is encoded.
There are now indications that this is in a jpeg format. So let’s try again to read them. We begin again by printing an overview of the datasets. I would think that they are stored in datasets 8 and 9…
= '14200215102021-blindTest2AgedDetail.HDF5' # 50 Mb
crono_filename = read_datasets(crono_filename)
datasets
for i, d in enumerate(datasets):
= ' '
star if i in [8, 9]:
= '*'
star print(f' {star}[{i}] {d.name}')
[0] /Configuration/FinalSystemStatus
[1] /Configuration/InitialSystemStatus
[2] /Configuration/Settings
[3] /CreatedDateTime
[4] /CreatedWithSoftwareVersion
[5] /FileStructureVersion
[6] /Images/Documentation
[7] /Images/ImageAdjusting/ImagePixelSizeRatio
*[8] /Images/Static
*[9] /Images/StitchedImage
[10] /Images/VideoStreams
[11] /XRF/CalibrationPoints
[12] /XRF/DPPStartTimestamp
[13] /XRF/Detected
[14] /XRF/EnergyVector
[15] /XRF/LiveTimes
[16] /XRF/Maps/ComputedMaps
[17] /XRF/MotorsPositions
[18] /XRF/MotorsPositionsStats
[19] /XRF/MotorsTimestamps
[20] /XRF/OutputCountRates
[21] /XRF/ROIs/ROIsEnergies
[22] /XRF/ROIs/ROIsNames
[23] /XRF/ROIs/ROIsObjects
[24] /XRF/RealTimes
[25] /XRF/ResetCounterValue
[26] /XRF/Spectra
[27] /XRF/SpectraIDs
[28] /XRF/SpectraSelectedIndex
[29] /XRF/Timestamps
[30] /XRF/XComputedMapsCoordinate
[31] /XRF/YComputedMapsCoordinate
Of most direct use would be to extract the stitched image. Let’s see if we can read the dataset as a binary string. We can explore the contents if this dataset as follows by adding square brackets and three dots [...]
.
9][...] datasets[
array([array([], dtype='|V1')], dtype=object)
Unfortunately, for our demo data the stitched image appears not to be saved into the HDF5 file. The dataset 9 is just an empty placeholder. It seems that one needs explicitly to create a stitched image as a separate step in the Crono software. So instead we will now need to work with the separate images that are captured for each spectrum location.
Extracting the jpeg images
As a first step we need to learn how to extract the images from the binary blobs in the dataset. Let’s not worry yet about stitching them.
= datasets[8][1:] # ignore first (empty) element
im_blobs
print(f'Dataset 8 contains {len(im_blobs)} of binary data blobs')
Dataset 8 contains 13357 of binary data blobs
Each binary blob contains an image. I want to explain how to get the image out, because it is rather weird. Let’s first take a look at a single blob by converting the numpy array into a binary string…
= im_blobs[0].tobytes()
binary_string
binary_string
b'\x00\x01\x00\x00\x00\xff\xff\xff\xff\x01\x00\x00\x00\x00\x00\x00\x00\x0f\x01\x00\x00\x00\xe9\t\x00\x00\x02\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00`\x00`\x00\x00\xff\xe1\x00BExif\x00\x00MM\x00*\x00\x00\x00\x08\x00\x01\x87i\x00\x04\x00\x00\x00\x01\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x01\x90\x03\x00\x02\x00\x00\x00\r\x00\x00\x00,\x00\x00\x00\x00125903170418\x00\x00\xff\xdb\x00C\x00\x08\x06\x06\x07\x06\x05\x08\x07\x07\x07\t\t\x08\n\x0c\x14\r\x0c\x0b\x0b\x0c\x19\x12\x13\x0f\x14\x1d\x1a\x1f\x1e\x1d\x1a\x1c\x1c $.\' ",#\x1c\x1c(7),01444\x1f\'9=82<.342\xff\xdb\x00C\x01\t\t\t\x0c\x0b\x0c\x18\r\r\x182!\x1c!22222222222222222222222222222222222222222222222222\xff\xc0\x00\x11\x08\x00k\x00\x8f\x03\x01"\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x1f\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\xff\xc4\x00\xb5\x10\x00\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04\x00\x00\x01}\x01\x02\x03\x00\x04\x11\x05\x12!1A\x06\x13Qa\x07"q\x142\x81\x91\xa1\x08#B\xb1\xc1\x15R\xd1\xf0$3br\x82\t\n\x16\x17\x18\x19\x1a%&\'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xc4\x00\x1f\x01\x00\x03\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\xff\xc4\x00\xb5\x11\x00\x02\x01\x02\x04\x04\x03\x04\x07\x05\x04\x04\x00\x01\x02w\x00\x01\x02\x03\x11\x04\x05!1\x06\x12AQ\x07aq\x13"2\x81\x08\x14B\x91\xa1\xb1\xc1\t#3R\xf0\x15br\xd1\n\x16$4\xe1%\xf1\x17\x18\x19\x1a&\'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00\xf0\x1a(\xa5\xa4\x01\xd7\x81^\xdf\xf0\xd2\xc8\xd9\xf8d\xb3\xb1\xcc\xd2\x97\xc1=8\x02\xbcE\t\x0e\xa4z\xd7\xd0>\x12 \xe80c#<\xf2*$\xd8\\\xe8wf\x8c\x8ag8\xa5\x04\x03R"@ww\xc5#`)9\xc9\xa4#<\xe7\x14\xd6a\xb4\xd04H\xa5\x8a\xfbPp\x17\x93Q\xa9\xc2\x8ep)K\x8cq\xcd\x001\xcf\x1cT-\xc7$\xd4\x8cr}*&p\x07L\xd5\x08\x88\x92[\xa7\x1e\xf4\x8c\xaa\xc0\x86\x00\x83\xebJ\xcf\x9e\x98\xa8\xdfoRh\xb8\x1cW\x8e\xbc>\xd7V\xff\x00\xda6(ZH\x80\xf3\x10\x0eJ\xfa\x8f\xa5O\xe1V\xb2\xd7\xb48\xcb\x9d\xd70\xfe\xeeU#\x9e:\x1f\xc4b\xba\xdc\xe4c\x8eF?\n\xf3aeu\xe1\xcf\x88*\x96\x91\x89"\xb9;\xbc\xb5\xe3\xe5c\xc8\xf6\xc7\xf8PQ\xd9\x1f\r\xd8\x91\x81\x12\x9f\xc2\xa1o\nZ\xb7\x1bT}\x05o+\xaez`\xd2\xb18\xeb\xf9SH\x96\xcf\x9b\xe9\r\x19\xa2\xa8c\xa3\x1b\xa4Q\xea@\xaf\xa1\xfc;\x10\xb7\xd0\xed#L\x95\x0895\xf3\xd5\xba<\x93\xc6\x91\xfd\xf6`\x16\xbe\x89\xd2\x95\xa3\xd2\xadQ\xb2\x19bPG^k9\xbdFiq\xdc\xfe\x14\xbb\x81<\n\x87\xa7\xd6\x97$\x9eN*."B{\xe6\x92F\xfd\xd9\xda9\xa6\x17\xc1\xc7_z\x0ev\xf3\xc5;\x81 \xe4\x02\xde\x94\x12q\xc5F\x81T\x03\x9aRI\xe9\xc51\x8dc\x93\xc9\xa6\x17\xc7\x02\x95\xbd\xcdB\xc4\xf6\xa0\x06\x9f\x99\x884\xdc\xa2\xf1\xd4\xfet\xd9\x07s\xcdDOu\xe7\xebM\x12I\xceI\xfb\xb5\x9d{\xa4Gw\xa9Z\xea)3Es\x00\xdb\x95\x19\xdc=\x0f\xebW\xb7\x16\xce\x7f!Q\x02\xa8\xb8\x03\x19\xfc\xe9\x85\xc9Cd\x9c\xf4\xecM\x05\xb1\xc6sQ\x1c\x8e:(\xf5\xa02\xe3 \xe6\x9abg\xcf\x94Q@\xaa(\xd1\xd0\x80mn\xcc\x15\xc8\xf3Fk\xe8\x04\xf9Ps\xd0t\xcdxw\x83#\x12x\x9e\xd4\x1c\xf5\'\x8a\xf6\xa8\xca\x06\'\xe6\xc9<\xe4\xd657\x02\xe0\x91\x88\xc0\x14n\xfe\xf1\xcdA\xbb=[\x8fjP\xca:sR\x05\x85l\xf4\xa6\xcd\xf7\t,p9\xa6e\xba\xf4\xa4v\xc2s\xce{u\xa0d\xb1\xb2\xba\x02\xa7\x8fj\\\x92\x0e\x0f\x1e\xd5\x1a\xee\n0\x02\x8a2\xa3\xabU&\x02\xb7O\x94f\xa1l\xf4\xce*C\'\x18\x035\x13\x9c\x8c\x13\xf9q@\x86\x1c\x0e\xbdj\x95\xed\xd4\x16\xb0\x19n$\x11F\xbdY\x8dY\x91\x82\xa3\x1c\xf095\xe4\x1e,\xd7f\xd5\xb5&D\x90\x9b8\x8e\x15q\xc6GSM\x01\xb5\xab\xf8\xfeg/\x0e\x99\x08T_\xf9k\'$\xfd\x07\x18\xfdk\x06\xeb\xc4\xda\xa5\xda)\x9a\xeeM\x9b\xb3\xb2<\xa8>\xde\xe2\xb0\xc8\xde\xc1@\xcb\x13\xc0\x1d\xeb\xa6\xd1\xbc#5\xfa\xac\xd7\x0ea\x88\x1c\x10G\xcci\xecZH\xb3\x1f\x8e/\xfc\x94\x86t\x8bg\x00\xc9\x18 \xd7e\xa2j\x96\xb7\xfar\xcbnJ\x80pCu\xcdfC\xe0\xdd\x15$\xdebv\x1bq\xb5\x98\xe3\xeb\xebZ\x96\x16\x16z\\/\x15\x94e\x11\x8eH\x04\x9eh\xd5\xecCh\xf1Z(\xa2\xb4\x03\xab\xf8\x7fn&\xf1*\xbf\xfc\xf2\x8c\xbfZ\xf5\xe1\x9e\x84W\x96\xfc6L\xea\xb7rwX\xbf\x99\xafO\x04\x91\x9c\xe3\xd7\x15\x8c\xf7\x01\xfct\'\xf04\xfeH#\x1f\xd2\xa3\xcau\xe74\xb9?\xde\xe0T\x01 \xdd\xd4\xb7\xe1D\x84\xec%\x00\'\xda\xa3\xc8\xc6@\xcf\xd6\x9a\xee|\xb3\xc6=3L\x0b\x08\xccPn?\\R\x10\x80\xe4rj\xbae>b\xe4\x83\xd8\xf6\xa9U\xc1\xed@\xc7\xf3\x8e8\xa6>\x07S\x9f\xa9\xa4/\x91\xd7\x03\xda\xa3fQ\xd0\x93\x9fJb#r\n\x9c\xe7\xf9\n\xf2\xcf\x1a\xe8\xe3O\xd4\r\xcc1\xe2\xdenF\xd1\xc2\xb5z\x8b\x96\xce1\x8f\xaf5\x97\xabX\xc5\xa9Y\xc9kr\x01F\xef\xdc\x1fQM\rhr\x9e\x12\xf0\xfc\x06\xda-M\xa4Y\x1d\xc1\x026O\xbaGB\x0f\xadu\xe06\xe6l\x00O_z\xe4t\xbb\xd9<7x\xdaU\xfb\xff\x00\xa3\xb9\xcc\x12\xe3\x8e\x7f\xa75\xd3\x87v\x1b\xb7\x82\xa7\xa1\x1d\xe9\x89\x92n\x19\xf9\xcf\xe1I\xb9\x8f\n8\xed\x8a\x88\x91\x81\xd0\xd2\x06*sVA\xe4\xb3\xe9W\xf6\xb1\x87\x9e\xd2dS\xd0\xb2\x1cTPZOq2\xc5\x0c.\xf2\x1e\x8a\xa3\x9a\xf6\xc2\x12E\xc3s\xd8\x83DqE\x19\xca\xc4\xa0\xf4\xc8\x15\x1e\xd1\x97s\x88\xf8s\x14\xb1\xeaW\xca\xcb\xb7j\x00\xc1\x87C\x9a\xf4l\x05\xe8\xd5N\x18-\xed\xcb\x18\xd1\x13y\xcbm\x18\xcdN\xb2\xaf`j$\xdbw\x11(9\xc9\x19\x02\x9c\x01\xce\xec\xf1Q\xef\xcfZO5G\x19\xfe\xb4\x0e\xe4\xca\xc0\x92\x14\xfe&\x92V\xf9z\xfeT\xcf3\x8c\x05\xa4f]\x84\x1e\xb8\xeai\x01 |\x0e\x99\xfdh\x0cOQ\x81LG\xc4k\x8ex\xa3$\xf3\xc51\x0eo^\xfe\xf5\x1e\xf6\xc6\x02\xd3\xb7\xed\xe4\x8c\xd3ZV?\xc2\x14{\xd3@4\xb1+\xcbc\xda\xab\x12\xacz\xe6\xa5\x90\x03\x92O\xe7U\xda@>\xef\xe8*\x80\xcc\xd7thu{?)\x86\xd7^cr~\xe9\xff\x00\n\xe7\xfc3\xa8\xb2\xbc\xba]\xc3\xb1\x96\x12v\x92z\xfa\xd7^\xe5\xb1\xd3\x1e\xf9\xac{\xad*\xceK\xd8\xef\x1b\x11K\x1bn\xf3\x00\xc6\xefcL.]\xde\xbd\xb9\xa6\x97\'\xae?:\x8b\xcc\x89N\xd0\xc3\xd8\n\x0b\xa9?\xe1T\x98\x99\xa2\x8f\xc6z\x9a\x7f\x98\xe4\xf0@\x15Ye-\xfc8\xc5?+\x8eNEga\x16\x03\x8f\xae*Es\x8c\x8e*\xa0\x94\xfaq\xda\x9c$`3\xc7\xd2\x90\xd1kw\xa9\xcd(\x90\x8e\xdf\x9d@\xb2\xa8\x1cu\xf6\xa7\x16=\xcf\xf5\xa42S\xb8\xf2O\xe5P\xdcO\xe5B\xcd\xd8\nM\xdb{\x92}\xea\x0b\xf0\xd3Z<H\xdbY\xc62{P\x05\xaby_\xcbR\xe3\x04\xf5\xc5H\xd3(\xe5\x8f\x15N\xd4<V\xa9\x1c\x8d\xb9\x80\xc18\xc6jO0t\xc0\xfc(\x02Ar3\xf2\x82q\xebO\x12\x8fP\rT\x91\x9c)*?:\xaa\x93K\xbfk(\x03\xd6\x8b\xd8\x0b\xf2:\x93\x9e\xa7\xdf\x9a\xad$\xae\x14\xe0\x1f\xc6\x9e\xb2\xa9\x18\x075\x1c\xa4\xa1\xc9\xfc*\x90\x15^K\x82\xbd\xb2x\xfaU\x19\x0c\x84\x98\xc8g9\xeaj\xfe\xed\xff\x003\x1cg\xd6\x9a\xcc\x87\x85\xebM!\\\xc9\x92\xdain\x16I\tP\x9ft)\xab\xdb\xce9\xebC\x02\xc4\x8eF;\xd4M\x81\xd5\xbaz\xd5\xa5a=M\x05\x93\x1f|\xd0\\1\xe3?\x853\x03\x00\xe3\x9ap\xfb\xb9\xefP\x04\x99#\x9c\xf1F\xee\xf9\xe6\xa0O\x99\xb9\xe6\xa4\x1c\x9c{\xd4\x810v\xc0\xed\x9e\xf4\xed\xcc>\xf3\x92=\xaa\x12\xc7!s\xc59@\xe6\x98\xc9L\x80}\xd0~\xb4\xc6rA\xf9\xb0=sH\x7f\xd5\xb5@\x18\xf9l3\xc0\x14XD\xc1\xf6(\xdc\xdd{\x13\x9a\x90L\xc7\xb5S\xb6c\xbd\x86\x7f\x86\x9d3\xb0e\xc1\xa9\xb8\xecXg`s\x9f\xa8\xaa\xd3\\\xf9l0\x99\xa9\xa2\xf9\x97\'\x93H\x14\x12\xc0\x81\xd2\x86R!\xfbp\x03\x85\xda}M4Nns\xbd\x86\x14\xf1\xb7\xbdQ\x9c\x0f6\xa4O\x9a0\t8\xcf@qBm\xb0h\x9d\xb6\xee\xc9=:S\x1c\xfc\xc0\xe7\xfaT\xbb\x14.@\x15\x16\x01$\x91[$A\x1b\xb3\xb0\xc1?\x95S\x9e@\xb8\xce3\xeej\xd31*A<U+\xbe\x13\x80?*`\x7f\xff\xd9\x0b'
In this binary data there is a jpeg file lurking somewhere. Now, if you would try to save this string as a file straight away, it does not produce a valid jpeg file. A proper jpeg file should start with \xff\xd8
and end with \xff\xd9
. So if we remove the first 28 characters and the last character we select the actual jpeg part of the binary string. I learned this here: https://laurentmeyer.medium.com/understanding-jpeg-format-the-hard-way-57dd34abe2f1
= binary_string[27:-1]
jpeg jpeg
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00`\x00`\x00\x00\xff\xe1\x00BExif\x00\x00MM\x00*\x00\x00\x00\x08\x00\x01\x87i\x00\x04\x00\x00\x00\x01\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x01\x90\x03\x00\x02\x00\x00\x00\r\x00\x00\x00,\x00\x00\x00\x00125903170418\x00\x00\xff\xdb\x00C\x00\x08\x06\x06\x07\x06\x05\x08\x07\x07\x07\t\t\x08\n\x0c\x14\r\x0c\x0b\x0b\x0c\x19\x12\x13\x0f\x14\x1d\x1a\x1f\x1e\x1d\x1a\x1c\x1c $.\' ",#\x1c\x1c(7),01444\x1f\'9=82<.342\xff\xdb\x00C\x01\t\t\t\x0c\x0b\x0c\x18\r\r\x182!\x1c!22222222222222222222222222222222222222222222222222\xff\xc0\x00\x11\x08\x00k\x00\x8f\x03\x01"\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x1f\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\xff\xc4\x00\xb5\x10\x00\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04\x00\x00\x01}\x01\x02\x03\x00\x04\x11\x05\x12!1A\x06\x13Qa\x07"q\x142\x81\x91\xa1\x08#B\xb1\xc1\x15R\xd1\xf0$3br\x82\t\n\x16\x17\x18\x19\x1a%&\'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xc4\x00\x1f\x01\x00\x03\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\xff\xc4\x00\xb5\x11\x00\x02\x01\x02\x04\x04\x03\x04\x07\x05\x04\x04\x00\x01\x02w\x00\x01\x02\x03\x11\x04\x05!1\x06\x12AQ\x07aq\x13"2\x81\x08\x14B\x91\xa1\xb1\xc1\t#3R\xf0\x15br\xd1\n\x16$4\xe1%\xf1\x17\x18\x19\x1a&\'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00\xf0\x1a(\xa5\xa4\x01\xd7\x81^\xdf\xf0\xd2\xc8\xd9\xf8d\xb3\xb1\xcc\xd2\x97\xc1=8\x02\xbcE\t\x0e\xa4z\xd7\xd0>\x12 \xe80c#<\xf2*$\xd8\\\xe8wf\x8c\x8ag8\xa5\x04\x03R"@ww\xc5#`)9\xc9\xa4#<\xe7\x14\xd6a\xb4\xd04H\xa5\x8a\xfbPp\x17\x93Q\xa9\xc2\x8ep)K\x8cq\xcd\x001\xcf\x1cT-\xc7$\xd4\x8cr}*&p\x07L\xd5\x08\x88\x92[\xa7\x1e\xf4\x8c\xaa\xc0\x86\x00\x83\xebJ\xcf\x9e\x98\xa8\xdfoRh\xb8\x1cW\x8e\xbc>\xd7V\xff\x00\xda6(ZH\x80\xf3\x10\x0eJ\xfa\x8f\xa5O\xe1V\xb2\xd7\xb48\xcb\x9d\xd70\xfe\xeeU#\x9e:\x1f\xc4b\xba\xdc\xe4c\x8eF?\n\xf3aeu\xe1\xcf\x88*\x96\x91\x89"\xb9;\xbc\xb5\xe3\xe5c\xc8\xf6\xc7\xf8PQ\xd9\x1f\r\xd8\x91\x81\x12\x9f\xc2\xa1o\nZ\xb7\x1bT}\x05o+\xaez`\xd2\xb18\xeb\xf9SH\x96\xcf\x9b\xe9\r\x19\xa2\xa8c\xa3\x1b\xa4Q\xea@\xaf\xa1\xfc;\x10\xb7\xd0\xed#L\x95\x0895\xf3\xd5\xba<\x93\xc6\x91\xfd\xf6`\x16\xbe\x89\xd2\x95\xa3\xd2\xadQ\xb2\x19bPG^k9\xbdFiq\xdc\xfe\x14\xbb\x81<\n\x87\xa7\xd6\x97$\x9eN*."B{\xe6\x92F\xfd\xd9\xda9\xa6\x17\xc1\xc7_z\x0ev\xf3\xc5;\x81 \xe4\x02\xde\x94\x12q\xc5F\x81T\x03\x9aRI\xe9\xc51\x8dc\x93\xc9\xa6\x17\xc7\x02\x95\xbd\xcdB\xc4\xf6\xa0\x06\x9f\x99\x884\xdc\xa2\xf1\xd4\xfet\xd9\x07s\xcdDOu\xe7\xebM\x12I\xceI\xfb\xb5\x9d{\xa4Gw\xa9Z\xea)3Es\x00\xdb\x95\x19\xdc=\x0f\xebW\xb7\x16\xce\x7f!Q\x02\xa8\xb8\x03\x19\xfc\xe9\x85\xc9Cd\x9c\xf4\xecM\x05\xb1\xc6sQ\x1c\x8e:(\xf5\xa02\xe3 \xe6\x9abg\xcf\x94Q@\xaa(\xd1\xd0\x80mn\xcc\x15\xc8\xf3Fk\xe8\x04\xf9Ps\xd0t\xcdxw\x83#\x12x\x9e\xd4\x1c\xf5\'\x8a\xf6\xa8\xca\x06\'\xe6\xc9<\xe4\xd657\x02\xe0\x91\x88\xc0\x14n\xfe\xf1\xcdA\xbb=[\x8fjP\xca:sR\x05\x85l\xf4\xa6\xcd\xf7\t,p9\xa6e\xba\xf4\xa4v\xc2s\xce{u\xa0d\xb1\xb2\xba\x02\xa7\x8fj\\\x92\x0e\x0f\x1e\xd5\x1a\xee\n0\x02\x8a2\xa3\xabU&\x02\xb7O\x94f\xa1l\xf4\xce*C\'\x18\x035\x13\x9c\x8c\x13\xf9q@\x86\x1c\x0e\xbdj\x95\xed\xd4\x16\xb0\x19n$\x11F\xbdY\x8dY\x91\x82\xa3\x1c\xf095\xe4\x1e,\xd7f\xd5\xb5&D\x90\x9b8\x8e\x15q\xc6GSM\x01\xb5\xab\xf8\xfeg/\x0e\x99\x08T_\xf9k\'$\xfd\x07\x18\xfdk\x06\xeb\xc4\xda\xa5\xda)\x9a\xeeM\x9b\xb3\xb2<\xa8>\xde\xe2\xb0\xc8\xde\xc1@\xcb\x13\xc0\x1d\xeb\xa6\xd1\xbc#5\xfa\xac\xd7\x0ea\x88\x1c\x10G\xcci\xecZH\xb3\x1f\x8e/\xfc\x94\x86t\x8bg\x00\xc9\x18 \xd7e\xa2j\x96\xb7\xfar\xcbnJ\x80pCu\xcdfC\xe0\xdd\x15$\xdebv\x1bq\xb5\x98\xe3\xeb\xebZ\x96\x16\x16z\\/\x15\x94e\x11\x8eH\x04\x9eh\xd5\xecCh\xf1Z(\xa2\xb4\x03\xab\xf8\x7fn&\xf1*\xbf\xfc\xf2\x8c\xbfZ\xf5\xe1\x9e\x84W\x96\xfc6L\xea\xb7rwX\xbf\x99\xafO\x04\x91\x9c\xe3\xd7\x15\x8c\xf7\x01\xfct\'\xf04\xfeH#\x1f\xd2\xa3\xcau\xe74\xb9?\xde\xe0T\x01 \xdd\xd4\xb7\xe1D\x84\xec%\x00\'\xda\xa3\xc8\xc6@\xcf\xd6\x9a\xee|\xb3\xc6=3L\x0b\x08\xccPn?\\R\x10\x80\xe4rj\xbae>b\xe4\x83\xd8\xf6\xa9U\xc1\xed@\xc7\xf3\x8e8\xa6>\x07S\x9f\xa9\xa4/\x91\xd7\x03\xda\xa3fQ\xd0\x93\x9fJb#r\n\x9c\xe7\xf9\n\xf2\xcf\x1a\xe8\xe3O\xd4\r\xcc1\xe2\xdenF\xd1\xc2\xb5z\x8b\x96\xce1\x8f\xaf5\x97\xabX\xc5\xa9Y\xc9kr\x01F\xef\xdc\x1fQM\rhr\x9e\x12\xf0\xfc\x06\xda-M\xa4Y\x1d\xc1\x026O\xbaGB\x0f\xadu\xe06\xe6l\x00O_z\xe4t\xbb\xd9<7x\xdaU\xfb\xff\x00\xa3\xb9\xcc\x12\xe3\x8e\x7f\xa75\xd3\x87v\x1b\xb7\x82\xa7\xa1\x1d\xe9\x89\x92n\x19\xf9\xcf\xe1I\xb9\x8f\n8\xed\x8a\x88\x91\x81\xd0\xd2\x06*sVA\xe4\xb3\xe9W\xf6\xb1\x87\x9e\xd2dS\xd0\xb2\x1cTPZOq2\xc5\x0c.\xf2\x1e\x8a\xa3\x9a\xf6\xc2\x12E\xc3s\xd8\x83DqE\x19\xca\xc4\xa0\xf4\xc8\x15\x1e\xd1\x97s\x88\xf8s\x14\xb1\xeaW\xca\xcb\xb7j\x00\xc1\x87C\x9a\xf4l\x05\xe8\xd5N\x18-\xed\xcb\x18\xd1\x13y\xcbm\x18\xcdN\xb2\xaf`j$\xdbw\x11(9\xc9\x19\x02\x9c\x01\xce\xec\xf1Q\xef\xcfZO5G\x19\xfe\xb4\x0e\xe4\xca\xc0\x92\x14\xfe&\x92V\xf9z\xfeT\xcf3\x8c\x05\xa4f]\x84\x1e\xb8\xeai\x01 |\x0e\x99\xfdh\x0cOQ\x81LG\xc4k\x8ex\xa3$\xf3\xc51\x0eo^\xfe\xf5\x1e\xf6\xc6\x02\xd3\xb7\xed\xe4\x8c\xd3ZV?\xc2\x14{\xd3@4\xb1+\xcbc\xda\xab\x12\xacz\xe6\xa5\x90\x03\x92O\xe7U\xda@>\xef\xe8*\x80\xcc\xd7thu{?)\x86\xd7^cr~\xe9\xff\x00\n\xe7\xfc3\xa8\xb2\xbc\xba]\xc3\xb1\x96\x12v\x92z\xfa\xd7^\xe5\xb1\xd3\x1e\xf9\xac{\xad*\xceK\xd8\xef\x1b\x11K\x1bn\xf3\x00\xc6\xefcL.]\xde\xbd\xb9\xa6\x97\'\xae?:\x8b\xcc\x89N\xd0\xc3\xd8\n\x0b\xa9?\xe1T\x98\x99\xa2\x8f\xc6z\x9a\x7f\x98\xe4\xf0@\x15Ye-\xfc8\xc5?+\x8eNEga\x16\x03\x8f\xae*Es\x8c\x8e*\xa0\x94\xfaq\xda\x9c$`3\xc7\xd2\x90\xd1kw\xa9\xcd(\x90\x8e\xdf\x9d@\xb2\xa8\x1cu\xf6\xa7\x16=\xcf\xf5\xa42S\xb8\xf2O\xe5P\xdcO\xe5B\xcd\xd8\nM\xdb{\x92}\xea\x0b\xf0\xd3Z<H\xdbY\xc62{P\x05\xaby_\xcbR\xe3\x04\xf5\xc5H\xd3(\xe5\x8f\x15N\xd4<V\xa9\x1c\x8d\xb9\x80\xc18\xc6jO0t\xc0\xfc(\x02Ar3\xf2\x82q\xebO\x12\x8fP\rT\x91\x9c)*?:\xaa\x93K\xbfk(\x03\xd6\x8b\xd8\x0b\xf2:\x93\x9e\xa7\xdf\x9a\xad$\xae\x14\xe0\x1f\xc6\x9e\xb2\xa9\x18\x075\x1c\xa4\xa1\xc9\xfc*\x90\x15^K\x82\xbd\xb2x\xfaU\x19\x0c\x84\x98\xc8g9\xeaj\xfe\xed\xff\x003\x1cg\xd6\x9a\xcc\x87\x85\xebM!\\\xc9\x92\xdain\x16I\tP\x9ft)\xab\xdb\xce9\xebC\x02\xc4\x8eF;\xd4M\x81\xd5\xbaz\xd5\xa5a=M\x05\x93\x1f|\xd0\\1\xe3?\x853\x03\x00\xe3\x9ap\xfb\xb9\xefP\x04\x99#\x9c\xf1F\xee\xf9\xe6\xa0O\x99\xb9\xe6\xa4\x1c\x9c{\xd4\x810v\xc0\xed\x9e\xf4\xed\xcc>\xf3\x92=\xaa\x12\xc7!s\xc59@\xe6\x98\xc9L\x80}\xd0~\xb4\xc6rA\xf9\xb0=sH\x7f\xd5\xb5@\x18\xf9l3\xc0\x14XD\xc1\xf6(\xdc\xdd{\x13\x9a\x90L\xc7\xb5S\xb6c\xbd\x86\x7f\x86\x9d3\xb0e\xc1\xa9\xb8\xecXg`s\x9f\xa8\xaa\xd3\\\xf9l0\x99\xa9\xa2\xf9\x97\'\x93H\x14\x12\xc0\x81\xd2\x86R!\xfbp\x03\x85\xda}M4Nns\xbd\x86\x14\xf1\xb7\xbdQ\x9c\x0f6\xa4O\x9a0\t8\xcf@qBm\xb0h\x9d\xb6\xee\xc9=:S\x1c\xfc\xc0\xe7\xfaT\xbb\x14.@\x15\x16\x01$\x91[$A\x1b\xb3\xb0\xc1?\x95S\x9e@\xb8\xce3\xeej\xd31*A<U+\xbe\x13\x80?*`\x7f\xff\xd9'
We can now read this jpeg binary code with standard Python packages as follows.
import numpy as np
import io
import matplotlib.pyplot as plt
from PIL import Image
= np.array(Image.open(io.BytesIO(jpeg)))
im
= plt.subplots(figsize=[8, 8])
fig, ax ; ax.imshow(im)
Lars, now it is up to you. Why do we get much more images then spectra? Where are these images positioned? What is the exact position of instrument aperture within the image? How can we stitch them? Which EXIF metadata is in these files?