diff options
author | Hubert Figuière <hub@figuiere.net> | 2024-06-16 11:02:37 -0400 |
---|---|---|
committer | Hubert Figuière <hub@figuiere.net> | 2024-06-16 22:11:22 -0400 |
commit | e1dfc5bd532db7db3be550a288c45366c4a19feb (patch) | |
tree | 197c027908490f5daa84e60aa2a4f127765889fc | |
parent | 67dbe25ca8c89135c758ed2f9591a57b697e88cd (diff) |
Signed-off-by: Hubert Figuière <hub@figuiere.net>
-rw-r--r-- | src/canon/cr2.rs | 21 | ||||
-rw-r--r-- | src/tiff/exif/tags.rs | 1 | ||||
-rw-r--r-- | testsuite/testsuite.xml | 6 |
3 files changed, 17 insertions, 11 deletions
diff --git a/src/canon/cr2.rs b/src/canon/cr2.rs index 752d931..863ab81 100644 --- a/src/canon/cr2.rs +++ b/src/canon/cr2.rs @@ -106,6 +106,18 @@ impl Cr2File { } } + fn detect_mosaic_pattern(&self, cfa_ifd: &Dir) -> Pattern { + let cfa_pattern = cfa_ifd.uint_value(exif::CR2_TAG_CFA_PATTERN).unwrap_or(1); + match cfa_pattern { + 3 => Pattern::Gbrg, + 1 => Pattern::Rggb, + _ => { + log::error!("Unkown CFA Pattern value {cfa_pattern}"); + Pattern::Rggb + } + } + } + /// Find the colour data in the file. fn colour_data(&self) -> Option<Vec<u16>> { self.maker_note_ifd().and_then(|mnote| { @@ -219,14 +231,7 @@ impl Cr2File { .and_then(super::SensorInfo::new) .map(|sensor_info| sensor_info.0); rawdata.set_active_area(sensor_info); - // They are not all RGGB. - // XXX but I don't seem to see where this is encoded. - // For the 5DMKII, DNG set an odd row for the active area. - if self.type_id() == canon!(EOS_5DMKII) { - rawdata.set_mosaic_pattern(Pattern::Gbrg); - } else { - rawdata.set_mosaic_pattern(Pattern::Rggb); - } + rawdata.set_mosaic_pattern(self.detect_mosaic_pattern(cfa_ifd)); if let Some(colour_data) = self.colour_data() { if let Some(colour_format) = ColourFormat::identify(&colour_data) { diff --git a/src/tiff/exif/tags.rs b/src/tiff/exif/tags.rs index 6f5ca7c..1b3f598 100644 --- a/src/tiff/exif/tags.rs +++ b/src/tiff/exif/tags.rs @@ -210,6 +210,7 @@ pub const ORF_TAG_RAW_INFO: u16 = 0x3000; /// This tag is present in the RAW IFD for Canon CR2. pub const _CR2_TAG_C5D8: u16 = 0xc5d8; pub const _CR2_TAG_C5D9: u16 = 0xc5d9; +pub const CR2_TAG_CFA_PATTERN: u16 = 0xc5e0; /// Exif tag for CR2 RAW "slices" pub const CR2_TAG_SLICE: u16 = 0xc640; pub const _CR2_TAG_SRAW_TYPE: u16 = 0xc6c5; diff --git a/testsuite/testsuite.xml b/testsuite/testsuite.xml index b3d9ac9..6835c77 100644 --- a/testsuite/testsuite.xml +++ b/testsuite/testsuite.xml @@ -75,7 +75,7 @@ <rawDataSize>37691520</rawDataSize> <rawDataDimensions>5360 3516</rawDataDimensions> <rawDataActiveArea>168 56 5184 3456</rawDataActiveArea> - <rawCfaPattern>RGGB</rawCfaPattern> + <rawCfaPattern>GBRG</rawCfaPattern> <rawMinValue>2047 2046 2048 2047</rawMinValue> <rawMaxValue>13584 13584 13584 13584</rawMaxValue> <rawAsShotNeutral>0.5029469548133595 1 0.45309734513274336 NaN</rawAsShotNeutral> @@ -103,7 +103,7 @@ <rawDataSize>37691520</rawDataSize> <rawDataDimensions>5360 3516</rawDataDimensions> <rawDataActiveArea>168 56 5184 3456</rawDataActiveArea> - <rawCfaPattern>RGGB</rawCfaPattern> + <rawCfaPattern>GBRG</rawCfaPattern> <rawMinValue>2046 2046 2049 2049</rawMinValue> <rawMaxValue>13584 13584 13584 13584</rawMaxValue> <rawAsShotNeutral>0.4727608494921514 1 0.6719160104986877 NaN</rawAsShotNeutral> @@ -131,7 +131,7 @@ <rawDataSize>44065536</rawDataSize> <rawDataDimensions>5792 3804</rawDataDimensions> <rawDataActiveArea>168 56 5616 3744</rawDataActiveArea> - <rawCfaPattern>RGGB</rawCfaPattern> + <rawCfaPattern>GBRG</rawCfaPattern> <rawMinValue>1021 1021 1020 1020</rawMinValue> <rawMaxValue>15600 15600 15600 15600</rawMaxValue> <rawAsShotNeutral>0.5301786576533076 1 0.401609363569861 NaN</rawAsShotNeutral> |