2009-03-19 6 views
4

Nous avons des problèmes avec une application ASP.NET qui permet aux utilisateurs de télécharger et de recadrer des images. Les images sont toutes mises à l'échelle à des tailles fixes par la suite. Nous manquons de mémoire lorsqu'un gros fichier est traité. il semble que la gestion de JPEG soit plutôt inefficace - nous utilisons System.Drawing.BitMap. Avez-vous des conseils généraux, et peut-être quelques indications pour une bibliothèque de traitement d'image plus efficace? Quelles expériences avez-vous?Comment redimensionner et rogner efficacement des images dans une application ASP.NET?

+1

Je suggère la http://imageresizing.net/ bibliothèque - il gère correctement l'utilisation de la mémoire, et vous évite d'éviter manuellement [les 28 + pièges] (http://nathanaeljones.com/163/20-image -resizing-pitfalls /) qui sont la raison pour laquelle MS met en garde contre l'utilisation de System.Drawing dans les applications ASP.NET. –

+0

duplication possible de [Redimensionner une image dans asp.net sans perdre la qualité de l'image] (http://stackoverflow.com/questions/2319983/resizing-an-image-in-asp-net-without-losing-the-image -quality) –

Répondre

4

J'ai eu le même problème, la solution était d'utiliser System.Drawing.Graphics pour faire les transformations et disposer chaque objet bitmap dès que j'en avais fini avec lui. Voici un exemple de ma bibliothèque (redimensionnement):

public Bitmap ApplyTo(Bitmap bitmap) 
    { 
     using (bitmap) 
     { 
      Bitmap newBitmap = new Bitmap(bitmap, CalculateNewSize(bitmap)); 

      using (Graphics graphics = Graphics.FromImage(newBitmap)) 
      { 
       graphics.SmoothingMode = 
        SmoothingMode.None; 
       graphics.InterpolationMode = 
        InterpolationMode.HighQualityBicubic; 
       graphics.CompositingQuality = 
        CompositingQuality.HighQuality; 

       graphics.DrawImage(
        bitmap, 
        new Rectangle(0, 0, newBitmap.Width, newBitmap.Height)); 
      } 

      return newBitmap; 
     } 
    } 
+0

Je fais des recadrages d'images et des mises à l'échelle similaires. Le point clé consiste à placer votre code dans des instructions 'using', qui ensuite se débarrassent automatiquement des ressources une fois que vous avez quitté le score du bloc using. Sinon, les données de l'image ne seront pas éliminées == gaspiller de la mémoire. –

+0

+1 pour disposer. Je vois nos clients oublier/ne pas savoir faire tout le temps. – Kev

+0

Merci, cela a apparemment résolu notre problème! –

0

Avez-vous peut-être une trace de pile à regarder?

J'ai aussi effectué une retouche d'image après qu'un utilisateur a téléchargé une image. Les seuls problèmes que j'ai rencontrés étaient des restrictions sur la taille du téléchargement de fichiers sur les navigateurs et les délais. Mais rien à voir avec les bibliothèques de .Net.

Autre chose à considérer. Si vous faites plusieurs images ou avez des boucles dangereuses quelque part, assurez-vous de vider() et de disposer() des choses.

1

Quelques pensées viennent à l'esprit -

  1. Quelle est la taille des images vous permettent vos utilisateurs de télécharger et vous pouvez imposer des restrictions sur ce?

  2. Lorsque vous utilisez la classe System.Drawing.Bitmap, vous ne pas oublier de disposer correctement? Nous avons trouvé l'une des principales causes des exceptions System.OutOfMemoryException sur notre plate-forme d'hébergement partagé, les utilisateurs ne disposaient pas correctement des objets Bitmap.

Kev

1

Il y avait un vieux bug avec .net que toutes les images seraient par défaut à 32 bits par pixel - cette taille, vous pouvez épuiser votre mémoire assez rapide. Veuillez utiliser la structure PixelFormat pour vous assurer que ce n'est pas le cas pour votre problème.

Ce lien pourrait aider: http://msdn.microsoft.com/en-us/library/aa479306.aspx

3

Je trouve imageresizer et son grand. et bonne API. Fonctionne très bien. À partir de Visual Studio 2010 Extension Manager: http://nuget.org/.

étapes faciles à télécharger API VS-2010:

1). Installez l'extension http://nuget.org/.

enter image description here

3). Trouver et installer ImageResizing
enter image description here

4) Code de .Ensuite:. (Je suis ici en utilisant le recadrage vous pouvez utiliser) Documentation sur imageresizing.net

string uploadFolder = Server.MapPath(Request.ApplicationPath + "images/"); 
FileUpload1.SaveAs(uploadFolder + FileUpload1.FileName); 


//The resizing settings can specify any of 30 commands.. See http://imageresizing.net for details. 
ResizeSettings resizeCropSettings = new ResizeSettings("width=200&height=200&format=jpg&crop=auto"); 

//Generate a filename (GUIDs are safest). 
string fileName = Path.Combine(uploadFolder, System.Guid.NewGuid().ToString()); 

//Let the image builder add the correct extension based on the output file type (which may differ). 
fileName = ImageBuilder.Current.Build(uploadFolder + FileUpload1.FileName, fileName, resizeCropSettings, false, true);

Essayez! !! C'est très awsumm et facile à utiliser. Merci.

Questions connexes