diff --git a/src/modules/imageresizer/tests/Models/ResizeOperationTests.cs b/src/modules/imageresizer/tests/Models/ResizeOperationTests.cs
index ea22ccd05c..b0d843e361 100644
--- a/src/modules/imageresizer/tests/Models/ResizeOperationTests.cs
+++ b/src/modules/imageresizer/tests/Models/ResizeOperationTests.cs
@@ -33,7 +33,7 @@ namespace ImageResizer.Models
}
[TestMethod]
- public void ExecuteCopiesFrameMetadataExceptWhenMetadataCannotBeCloned()
+ public void ExecuteCopiesFrameMetadataEvenWhenMetadataCannotBeCloned()
{
var operation = new ResizeOperation("TestMetadataIssue2447.jpg", _directory, Settings());
@@ -41,7 +41,7 @@ namespace ImageResizer.Models
AssertEx.Image(
_directory.File(),
- image => Assert.IsNull(((BitmapMetadata)image.Frames[0].Metadata).CameraModel));
+ image => Assert.IsNotNull(((BitmapMetadata)image.Frames[0].Metadata).CameraModel));
}
[TestMethod]
diff --git a/src/modules/imageresizer/ui/Extensions/BitmapMetadataExtension.cs b/src/modules/imageresizer/ui/Extensions/BitmapMetadataExtension.cs
index d6885c75ee..6bf4b4ace9 100644
--- a/src/modules/imageresizer/ui/Extensions/BitmapMetadataExtension.cs
+++ b/src/modules/imageresizer/ui/Extensions/BitmapMetadataExtension.cs
@@ -105,14 +105,31 @@ namespace ImageResizer.Extensions
}
///
- /// Gets all metadata
- /// Iterates recursively through all metadata
+ /// Gets all metadata.
+ /// Iterates recursively through metadata and adds valid items to a list while skipping invalid data items.
///
+ ///
+ /// Invalid data items are items which throw an exception when reading the data with metadata.GetQuery(...).
+ /// Sometimes Metadata collections are improper closed and cause an exception on IEnumerator.MoveNext(). In this case, we return all data items which were successfully collected so far.
+ ///
+ ///
+ /// metadata path and metadata value of all successfully read data items.
+ ///
public static List<(string metadataPath, object value)> GetListOfMetadata(this BitmapMetadata metadata)
{
var listOfAllMetadata = new List<(string metadataPath, object value)>();
- GetMetadataRecursively(metadata, string.Empty);
+ try
+ {
+ GetMetadataRecursively(metadata, string.Empty);
+ }
+#pragma warning disable CA1031 // Do not catch general exception types
+ catch (Exception ex)
+#pragma warning restore CA1031 // Do not catch general exception types
+ {
+ Debug.WriteLine($"Exception while trying to iterate recursively over metadata. We were able to read {listOfAllMetadata.Count} metadata entries.");
+ Debug.WriteLine(ex);
+ }
return listOfAllMetadata;
@@ -202,7 +219,17 @@ namespace ImageResizer.Extensions
{
var listOfAllMetadata = new List<(string metadataPath, object value)>();
- GetMetadataRecursively(metadata, string.Empty);
+ try
+ {
+ GetMetadataRecursively(metadata, string.Empty);
+ }
+#pragma warning disable CA1031 // Do not catch general exception types
+ catch (Exception ex)
+#pragma warning restore CA1031 // Do not catch general exception types
+ {
+ Debug.WriteLine($"Exception while trying to iterate recursively over metadata. We were able to read {listOfAllMetadata.Count} metadata entries.");
+ Debug.WriteLine(ex);
+ }
return listOfAllMetadata;
diff --git a/src/modules/imageresizer/ui/Models/ResizeOperation.cs b/src/modules/imageresizer/ui/Models/ResizeOperation.cs
index cf12b033f3..daf5b3137b 100644
--- a/src/modules/imageresizer/ui/Models/ResizeOperation.cs
+++ b/src/modules/imageresizer/ui/Models/ResizeOperation.cs
@@ -83,17 +83,14 @@ namespace ImageResizer.Models
{
try
{
- // Detect whether metadata can copied successfully
- var modifiableMetadata = metadata.Clone();
-
#if DEBUG
Debug.WriteLine($"### Processing metadata of file {_file}");
- modifiableMetadata.PrintsAllMetadataToDebugOutput();
+ metadata.PrintsAllMetadataToDebugOutput();
#endif
// read all metadata and build up metadata object from the scratch. Discard invalid (unreadable/unwritable) metadata.
var newMetadata = new BitmapMetadata(metadata.Format);
- var listOfMetadata = modifiableMetadata.GetListOfMetadata();
+ var listOfMetadata = metadata.GetListOfMetadata();
foreach (var (metadataPath, value) in listOfMetadata)
{
if (value is BitmapMetadata bitmapMetadata)