@@ -119,58 +119,58 @@ private Func<ImageWithBytes, ImageMetadata> GetImageMetaData
119
119
120
120
var ret = CreateEmbeddedFromProfile < ExifProfile , ImageMetadata . Exif >
121
121
( _commonEmbeddedMetadataXxHash3ToIgnore . Exif , exif , i => i . ToByteArray ( ) ) ;
122
- if ( ret != null && exif != null )
123
- { // https://exiftool.org/TagNames/EXIF.html, https://exiv2.org/tags.html
124
- ret . Orientation = exif . TryGetValue ( ExifTag . Orientation , out var orientation )
125
- ? Enum . GetName ( ( ImageMetadata . Exif . ExifOrientation ) orientation . Value )
126
- : null ;
127
- ret . ImageDescription = GetExifTagValueOrNull ( ExifTag . ImageDescription ) . NullIfEmpty ( ) ;
128
- ret . UserComment = GetExifTagValueOrNull2 ( ExifTag . UserComment ) . ToString ( ) . NullIfEmpty ( ) ;
129
- ret . Artist = GetExifTagValueOrNull ( ExifTag . Artist ) . NullIfEmpty ( ) ;
130
- ret . XpAuthor = GetExifTagValueOrNull ( ExifTag . XPAuthor ) . NullIfEmpty ( ) ;
131
- ret . Copyright = GetExifTagValueOrNull ( ExifTag . Copyright ) . NullIfEmpty ( ) ;
132
- ret . ImageUniqueId = GetExifTagValueOrNull ( ExifTag . ImageUniqueID ) . NullIfEmpty ( ) ;
133
- ret . BodySerialNumber = GetExifTagValueOrNull ( ExifTag . SerialNumber ) . NullIfEmpty ( ) ;
134
- ret . Make = GetExifTagValueOrNull ( ExifTag . Make ) . NullIfEmpty ( ) ;
135
- ret . Model = GetExifTagValueOrNull ( ExifTag . Model ) . NullIfEmpty ( ) ;
136
- ret . Software = GetExifTagValueOrNull ( ExifTag . Software ) . NullIfEmpty ( ) ;
137
- ret . CustomRendered = GetExifTagValueOrNull2 ( ExifTag . CustomRendered ) ;
138
-
139
- var parsedDateTime = ExifDateTimeTagValuesParser . ParseExifDateTimeOrNull (
140
- GetExifTagValueOrNull ( ExifTag . DateTime ) , GetExifTagValueOrNull ( ExifTag . SubsecTime ) ) ;
141
- ret . DateTime = parsedDateTime ? . DateTime ;
142
- ret . DateTimeOffset = parsedDateTime ? . Offset ;
143
-
144
- var parsedDateTimeDigitized = ExifDateTimeTagValuesParser . ParseExifDateTimeOrNull (
145
- GetExifTagValueOrNull ( ExifTag . DateTimeDigitized ) , GetExifTagValueOrNull ( ExifTag . SubsecTimeDigitized ) ) ;
146
- ret . DateTimeDigitized = parsedDateTimeDigitized ? . DateTime ;
147
- ret . DateTimeDigitizedOffset = parsedDateTimeDigitized ? . Offset ;
148
-
149
- var parsedDateTimeOriginal = ExifDateTimeTagValuesParser . ParseExifDateTimeOrNull (
150
- GetExifTagValueOrNull ( ExifTag . DateTimeOriginal ) , GetExifTagValueOrNull ( ExifTag . SubsecTimeOriginal ) ) ;
151
- ret . DateTimeOriginal = parsedDateTimeOriginal ? . DateTime ;
152
- ret . DateTimeOriginalOffset = parsedDateTimeOriginal ? . Offset ;
153
-
154
- ret . OffsetTime = GetExifTagValueOrNull ( ExifTag . OffsetTime ) . NullIfEmpty ( ) ;
155
- ret . OffsetTimeDigitized = GetExifTagValueOrNull ( ExifTag . OffsetTimeDigitized ) . NullIfEmpty ( ) ;
156
- ret . OffsetTimeOriginal = GetExifTagValueOrNull ( ExifTag . OffsetTimeOriginal ) . NullIfEmpty ( ) ;
157
-
158
- ret . GpsDateTime = ExifGpsTagValuesParser . ParseGpsDateTimeOrNull (
159
- GetExifTagValueOrNull ( ExifTag . GPSTimestamp ) ,
160
- GetExifTagValueOrNull ( ExifTag . GPSDateStamp ) ) ;
161
- ret . GpsCoordinate = ExifGpsTagValuesParser . ParseGpsCoordinateOrNull ( exif . Values ,
162
- GetExifTagValueOrNull ( ExifTag . GPSLatitude ) ,
163
- GetExifTagValueOrNull ( ExifTag . GPSLatitudeRef ) ,
164
- GetExifTagValueOrNull ( ExifTag . GPSLongitude ) ,
165
- GetExifTagValueOrNull ( ExifTag . GPSLongitudeRef ) ) ;
166
- ret . GpsImgDirection = GetExifTagValueOrNull2 ( ExifTag . GPSImgDirection ) ? . ToSingle ( ) . NanToNull ( ) ;
167
- ret . GpsImgDirectionRef = GetExifTagValueOrNull ( ExifTag . GPSImgDirectionRef ) . NullIfEmpty ( ) ;
168
-
169
- ret . TagNames = exif . Values . Select ( i => new ImageMetadata . Exif . TagName { Name = i . Tag . ToString ( ) } )
170
-
171
- // tags might be duplicated in EXIF with same or different values
172
- . DistinctBy ( tagName => tagName . Name ) . ToList ( ) ;
173
- }
122
+ if ( ret == null || exif == null ) return ret ;
123
+
124
+ // https://exiftool.org/TagNames/EXIF.html, https://exiv2.org/tags.html
125
+ ret . Orientation = exif . TryGetValue ( ExifTag . Orientation , out var orientation )
126
+ ? Enum . GetName ( ( ImageMetadata . Exif . ExifOrientation ) orientation . Value )
127
+ : null ;
128
+ ret . ImageDescription = GetExifTagValueOrNull ( ExifTag . ImageDescription ) . NullIfEmpty ( ) ;
129
+ ret . UserComment = GetExifTagValueOrNull2 ( ExifTag . UserComment ) . ToString ( ) . NullIfEmpty ( ) ;
130
+ ret . Artist = GetExifTagValueOrNull ( ExifTag . Artist ) . NullIfEmpty ( ) ;
131
+ ret . XpAuthor = GetExifTagValueOrNull ( ExifTag . XPAuthor ) . NullIfEmpty ( ) ;
132
+ ret . Copyright = GetExifTagValueOrNull ( ExifTag . Copyright ) . NullIfEmpty ( ) ;
133
+ ret . ImageUniqueId = GetExifTagValueOrNull ( ExifTag . ImageUniqueID ) . NullIfEmpty ( ) ;
134
+ ret . BodySerialNumber = GetExifTagValueOrNull ( ExifTag . SerialNumber ) . NullIfEmpty ( ) ;
135
+ ret . Make = GetExifTagValueOrNull ( ExifTag . Make ) . NullIfEmpty ( ) ;
136
+ ret . Model = GetExifTagValueOrNull ( ExifTag . Model ) . NullIfEmpty ( ) ;
137
+ ret . Software = GetExifTagValueOrNull ( ExifTag . Software ) . NullIfEmpty ( ) ;
138
+ ret . CustomRendered = GetExifTagValueOrNull2 ( ExifTag . CustomRendered ) ;
139
+
140
+ var parsedDateTime = ExifDateTimeTagValuesParser . ParseExifDateTimeOrNull (
141
+ GetExifTagValueOrNull ( ExifTag . DateTime ) , GetExifTagValueOrNull ( ExifTag . SubsecTime ) ) ;
142
+ ret . DateTime = parsedDateTime ? . DateTime ;
143
+ ret . DateTimeOffset = parsedDateTime ? . Offset ;
144
+
145
+ var parsedDateTimeDigitized = ExifDateTimeTagValuesParser . ParseExifDateTimeOrNull (
146
+ GetExifTagValueOrNull ( ExifTag . DateTimeDigitized ) , GetExifTagValueOrNull ( ExifTag . SubsecTimeDigitized ) ) ;
147
+ ret . DateTimeDigitized = parsedDateTimeDigitized ? . DateTime ;
148
+ ret . DateTimeDigitizedOffset = parsedDateTimeDigitized ? . Offset ;
149
+
150
+ var parsedDateTimeOriginal = ExifDateTimeTagValuesParser . ParseExifDateTimeOrNull (
151
+ GetExifTagValueOrNull ( ExifTag . DateTimeOriginal ) , GetExifTagValueOrNull ( ExifTag . SubsecTimeOriginal ) ) ;
152
+ ret . DateTimeOriginal = parsedDateTimeOriginal ? . DateTime ;
153
+ ret . DateTimeOriginalOffset = parsedDateTimeOriginal ? . Offset ;
154
+
155
+ ret . OffsetTime = GetExifTagValueOrNull ( ExifTag . OffsetTime ) . NullIfEmpty ( ) ;
156
+ ret . OffsetTimeDigitized = GetExifTagValueOrNull ( ExifTag . OffsetTimeDigitized ) . NullIfEmpty ( ) ;
157
+ ret . OffsetTimeOriginal = GetExifTagValueOrNull ( ExifTag . OffsetTimeOriginal ) . NullIfEmpty ( ) ;
158
+
159
+ ret . GpsDateTime = ExifGpsTagValuesParser . ParseGpsDateTimeOrNull (
160
+ GetExifTagValueOrNull ( ExifTag . GPSTimestamp ) ,
161
+ GetExifTagValueOrNull ( ExifTag . GPSDateStamp ) ) ;
162
+ ret . GpsCoordinate = ExifGpsTagValuesParser . ParseGpsCoordinateOrNull ( exif . Values ,
163
+ GetExifTagValueOrNull ( ExifTag . GPSLatitude ) ,
164
+ GetExifTagValueOrNull ( ExifTag . GPSLatitudeRef ) ,
165
+ GetExifTagValueOrNull ( ExifTag . GPSLongitude ) ,
166
+ GetExifTagValueOrNull ( ExifTag . GPSLongitudeRef ) ) ;
167
+ ret . GpsImgDirection = GetExifTagValueOrNull2 ( ExifTag . GPSImgDirection ) ? . ToSingle ( ) . NanToNull ( ) ;
168
+ ret . GpsImgDirectionRef = GetExifTagValueOrNull ( ExifTag . GPSImgDirectionRef ) . NullIfEmpty ( ) ;
169
+
170
+ ret . TagNames = exif . Values . Select ( i => new ImageMetadata . Exif . TagName { Name = i . Tag . ToString ( ) } )
171
+
172
+ // tags might be duplicated in EXIF with same or different values
173
+ . DistinctBy ( tagName => tagName . Name ) . ToList ( ) ;
174
174
return ret ;
175
175
}
176
176
@@ -199,7 +199,7 @@ private static class ExifGpsTagValuesParser
199
199
}
200
200
201
201
public static Point ? ParseGpsCoordinateOrNull (
202
- IReadOnlyList < IExifValue > allTagValues ,
202
+ IEnumerable < IExifValue > allTagValues ,
203
203
IEnumerable < Rational > ? latitude ,
204
204
string ? latitudeRef ,
205
205
IEnumerable < Rational > ? longitude ,
@@ -251,7 +251,7 @@ private static double ConvertDmsToDd(IReadOnlyList<double> dms)
251
251
}
252
252
}
253
253
254
- private sealed partial class ExifDateTimeTagValuesParser
254
+ private static partial class ExifDateTimeTagValuesParser
255
255
{
256
256
public static DateTimeAndOffset ? ParseExifDateTimeOrNull ( string ? exifDateTime , string ? exifFractionalSeconds )
257
257
{ // https://gist.github.com/thanatos/eee17100476a336a711e
0 commit comments