Avec WPF BitmapSource
, il n'y a pas d'élimination déterministe du flux sous-jacent, vous pouvez donc vous retrouver avec des serrures aussi longtemps qu'il y a une référence.
You --> XImage --> BitmapSource --> Stream
Si vous appelez disposer sur le XImage
, il libérera sa référence sur le BitmapSource
, ce qui permettra de finaliser quand le GC l'a envie.
Vous pouvez contrôler lorsque le fichier est fermé en fournissant un flux au lieu d'un chemin et en le fermant explicitement. Le faire prématurément provoquera des exceptions dans BitmapSource
, Cependant, assurez-vous donc que vous n'utilisez pas le BitmapSource
Après avoir fermé le flux.
using (var fsImage = File.Open(tiff_path, FileMode.Open, FileAccess.Read, FileShare.None))
{
var output = new PdfDocument();
var input = PdfReader.Open(template_path, PdfDocumentOpenMode.Import);
var page = input.Pages[0];
output.AddPage(page);
page = output.Pages[0];
var gfx = XGraphics.FromPdfPage(page);
var bitmapSource = new BitmapImage();
bitmapSource.BeginInit();
bitmapSource.StreamSource = fsImage;
bitmapSource.EndInit();
using (var image = XImage.FromBitmapSource(bitmapSource))
{
gfx.DrawImage(image, 500, 200, 400, 400);
}
output.Save(destination_path);
output.Close();
}
Si votre image est suffisamment petite, vous pouvez sauter le flux et simplement utiliser le BitmapCacheOption
de OnLoad
Pour fermer la source après l'ouverture, mais cela entraînera la charge de l'image entière dans la mémoire.