/// <summary> /// Decode raw CFAPattern value /// </summary> /// <remarks> /// Converted from Exiftool version 10.33 created by Phil Harvey /// http://www.sno.phy.queensu.ca/~phil/exiftool/ /// lib\Image\ExifTool\Exif.pm /// /// The value consists of: /// - Two short, being the grid width and height of the repeated pattern. /// - Next, for every pixel in that pattern, an identification code. /// </remarks> private int[] DecodeCFAPattern(int tagType) { int[] ret; var values = Directory.GetByteArray(tagType); if (values == null) { return(null); } if (values.Length < 4) { ret = new int[values.Length]; for (var i = 0; i < values.Length; i++) { ret[i] = values[i]; } return(ret); } IndexedReader reader = new ByteArrayReader(values); // first two values should be read as 16-bits (2 bytes) var item0 = reader.GetInt16(0); var item1 = reader.GetInt16(2); ret = new int[values.Length - 2]; var copyArray = false; var end = 2 + item0 * item1; if (end > values.Length) // sanity check in case of byte order problems; calculated 'end' should be <= length of the values { // try swapping byte order (I have seen this order different than in EXIF) reader = reader.WithByteOrder(!reader.IsMotorolaByteOrder); item0 = reader.GetInt16(0); item1 = reader.GetInt16(2); if (values.Length >= 2 + item0 * item1) { copyArray = true; } } else { copyArray = true; } if (copyArray) { ret[0] = item0; ret[1] = item1; for (var i = 4; i < values.Length; i++) { ret[i - 2] = reader.GetByte(i); } } return(ret); }