public byte[] GetData()
{
uint length = 0;
int exifIndex = -1;
int gpsIndex = -1;
if (_ExifIndexes.Count > 0)
exifIndex = (int)GetIndex(_IfdIndexes, ExifTag.SubIFDOffset);
if (_GPSIndexes.Count > 0)
gpsIndex = (int)GetIndex(_IfdIndexes, ExifTag.GPSIFDOffset);
uint ifdLength = 2 + GetLength(_IfdIndexes) + 4;
uint exifLength = GetLength(_ExifIndexes);
uint gpsLength = GetLength(_GPSIndexes);
if (exifLength > 0)
exifLength += 2;
if (gpsLength > 0)
gpsLength += 2;
length = ifdLength + exifLength + gpsLength;
if (length == 6)
return null;
length += 10 + 4 + 2;
byte[] result = new byte[length];
result[0] = (byte)'E';
result[1] = (byte)'x';
result[2] = (byte)'i';
result[3] = (byte)'f';
result[4] = 0x00;
result[5] = 0x00;
result[6] = (byte)'I';
result[7] = (byte)'I';
result[8] = 0x2A;
result[9] = 0x00;
int i = 10;
uint ifdOffset = ((uint)i - _StartIndex) + 4;
uint thumbnailOffset = ifdOffset + ifdLength + exifLength + gpsLength;
if (exifLength > 0)
_Values[exifIndex].Value = ifdOffset + ifdLength;
if (gpsLength > 0)
_Values[gpsIndex].Value = ifdOffset + ifdLength + exifLength;
i = Write(BitConverter.GetBytes(ifdOffset), result, i);
i = WriteHeaders(_IfdIndexes, result, i);
i = Write(BitConverter.GetBytes(thumbnailOffset), result, i);
i = WriteData(_IfdIndexes, result, i);
if (exifLength > 0)
{
i = WriteHeaders(_ExifIndexes, result, i);
i = WriteData(_ExifIndexes, result, i);
}
if (gpsLength > 0)
{
i = WriteHeaders(_GPSIndexes, result, i);
i = WriteData(_GPSIndexes, result, i);
}
Write(BitConverter.GetBytes((ushort)0), result, i);
return result;
}
}