Ce code fonctionne très bien pour générer des vignettes, mais lorsqu'il reçoit un très gros fichier TIFF (100MB +), il renvoie OutOfMemoryExceptions. Lorsque je le fais manuellement dans Paint.NET sur la même machine, cela fonctionne très bien. Comment puis-je améliorer ce code pour arrêter de lancer sur de très gros fichiers?Pourquoi ce code de génération de vignettes renvoie OutOfMemoryException sur les fichiers volumineux?
Dans ce cas, je charge un TIF de 721 Mo sur une machine avec 8 Go de RAM. Le gestionnaire de tâches montre 2 Go utilisé donc quelque chose l'empêche de en utilisant toute cette mémoire. Spécifiquement, il se lance lorsque je charge l'image pour calculer la taille de l'original. Ce qui donne?
/// <summary>Creates a thumbnail of a given image.</summary>
/// <param name="inFile">Fully qualified path to file to create a thumbnail of</param>
/// <param name="outFile">Fully qualified path to created thumbnail</param>
/// <param name="x">Width of thumbnail</param>
/// <returns>flag; result = is success</returns>
public static bool CreateThumbnail(string inFile, string outFile, int x)
{
// Mathematically determine Y dimension
int y;
using (Image img = Image.FromFile(inFile)) // Exception thrown
y = (int)((double)img.Height * ((double)x/(double)img.Width));
// Make thumbnail
using (Bitmap bmp = new Bitmap(inFile))
using (Bitmap thumb = new Bitmap((Image)bmp, new Size(x, y)))
using (Graphics g = Graphics.FromImage(thumb)) {
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.High;
g.CompositingQuality = CompositingQuality.HighQuality;
ImageCodecInfo codec = ImageCodecInfo.GetImageEncoders()[1];
EncoderParameters ep2 = new EncoderParameters(1);
ep2.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
g.DrawImage(bmp, new Rectangle(0,0,thumb.Width, thumb.Height));
try {
thumb.Save(outFile, codec, ep2);
return true; }
catch { return false; }
}
}
Est-ce que cela se produit avec toutes les images de cette taille ou avec des instances particulières? Je sais que je reçois OOM de GDI pour certaines images indépendamment de leur taille et cela finit généralement par ne pas sauter par les bons cerceaux GDI pour le flux en cours. –
Chaque très grande image, JPG ou TIF. Principalement TIF juste parce que c'est la plupart de mon "imagebase". Fonctionne très bien pour les fichiers de moins de 100 Mo, et certains de mes TIF vont dans les Go. – tsilb
tsilb: J'ai saisi le code de validation (car il n'a pas touché le fichier) et pressé le formatage pour rendre le bloc de code moins intimidant. Veuillez revenir en arrière si vous pensez que ces changements ont éliminé quelque chose d'important. – itowlson