mirror of
https://github.com/QL-Win/QuickLook.git
synced 2026-02-27 01:00:11 +08:00
Improve Magick image disposal and layer handling #1586
Refactored ImageMagickProvider to properly manage ownership and disposal of MagickImage instances, especially when flattening multi-layer XCF files. Updated logic to avoid unnecessary loading of all layers for non-XCF formats, improving performance and resource management. Minor formatting changes in CursorProvider and WebPProvider for consistency.
This commit is contained in:
@@ -97,7 +97,7 @@ internal class CursorProvider : ImageMagickProvider
|
||||
{
|
||||
OutputColor = DngOutputColor.SRGB,
|
||||
UseCameraWhiteBalance = true,
|
||||
DisableAutoBrightness = false
|
||||
DisableAutoBrightness = false,
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -87,23 +87,34 @@ internal class ImageMagickProvider : AnimationProvider
|
||||
{
|
||||
OutputColor = DngOutputColor.SRGB,
|
||||
UseCameraWhiteBalance = true,
|
||||
DisableAutoBrightness = false
|
||||
DisableAutoBrightness = false,
|
||||
}
|
||||
};
|
||||
|
||||
IMagickImage<byte> mi = null;
|
||||
var isImageOwned = false; // Track whether this provider owns the Magick image instance and must dispose it.
|
||||
|
||||
try
|
||||
{
|
||||
using var layers = new MagickImageCollection(Path.LocalPath, settings);
|
||||
IMagickImage<byte> mi;
|
||||
// Only flatten multi-layer gimp xcf files.
|
||||
if (Path.LocalPath.ToLower().EndsWith(".xcf") && layers.Count > 1)
|
||||
// Only flatten multi-layer gimp xcf files. Other formats (e.g. PSD) should avoid
|
||||
// loading all layers via MagickImageCollection for performance.
|
||||
if (Path.LocalPath.ToLower().EndsWith(".xcf"))
|
||||
{
|
||||
// Flatten crops layers to canvas
|
||||
mi = layers.Flatten(MagickColor.FromRgba(0, 0, 0, 0));
|
||||
using var layers = new MagickImageCollection(Path.LocalPath, settings);
|
||||
if (layers.Count > 1)
|
||||
{
|
||||
mi = layers.Flatten(MagickColor.FromRgba(0, 0, 0, 0));
|
||||
isImageOwned = true; // Flatten creates a new image instance we must dispose.
|
||||
}
|
||||
else
|
||||
{
|
||||
mi = layers[0];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mi = layers[0];
|
||||
mi = new MagickImage(Path.LocalPath, settings);
|
||||
isImageOwned = true; // New MagickImage created here must be disposed by this provider.
|
||||
}
|
||||
if (SettingHelper.Get("UseColorProfile", false, "QuickLook.Plugin.ImageViewer"))
|
||||
{
|
||||
@@ -133,6 +144,11 @@ internal class ImageMagickProvider : AnimationProvider
|
||||
ProcessHelper.WriteLog(e.ToString());
|
||||
return null!;
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (isImageOwned)
|
||||
mi?.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public override void Dispose()
|
||||
|
||||
@@ -52,7 +52,7 @@ internal class WebPProvider : ImageMagickProvider
|
||||
{
|
||||
OutputColor = DngOutputColor.SRGB,
|
||||
UseCameraWhiteBalance = true,
|
||||
DisableAutoBrightness = false
|
||||
DisableAutoBrightness = false,
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user