J'ai écrit un service Web pour redimensionner les images téléchargées par l'utilisateur et tout fonctionne correctement d'un point de vue fonctionnel, mais l'utilisation du processeur augmente chaque fois qu'il est utilisé. Il fonctionne sur Windows Server 2008 64 bits. J'ai essayé de compiler à 32 et 64 bits et obtenir à peu près les mêmes résultats.Efficacité de redimensionnement de l'image en C# et .NET 3.5
Le cœur du service est cette fonction:
private Image CreateReducedImage(Image imgOrig, Size NewSize)
{
var newBM = new Bitmap(NewSize.Width, NewSize.Height);
using (var newGrapics = Graphics.FromImage(newBM))
{
newGrapics.CompositingQuality = CompositingQuality.HighSpeed;
newGrapics.SmoothingMode = SmoothingMode.HighSpeed;
newGrapics.InterpolationMode = InterpolationMode.HighQualityBicubic;
newGrapics.DrawImage(imgOrig, new Rectangle(0, 0, NewSize.Width, NewSize.Height));
}
return newBM;
}
Je mets un profileur sur le service et il semble indiquer que la grande majorité du temps est consacré à la bibliothèque GDI + lui-même et il n'y a pas grand-chose à gagner dans mon code. Est-ce que je fais quelque chose de manifestement inefficace dans mon code ici? Il semble se conformer à l'exemple que j'ai vu.
Y a-t-il des avantages à utiliser des bibliothèques autres que GDI +? Les benchmarks que j'ai vus semblent indiquer que GDI + se compare bien à d'autres bibliothèques mais je n'en ai pas trouvé assez pour être confiant.
Y a-t-il des avantages à utiliser des blocs "code non sécurisé"? S'il vous plaît laissez-moi savoir si je n'ai pas inclus assez du code ... Je suis heureux de mettre autant que demandé, mais ne veulent pas être désagréable dans le poste.
Si vous exécutez ceci dans une boucle serrée, combien d'images/sec pouvez-vous traiter à quelles tailles d'image d'entrée/sortie? –
Si je cours seulement la partie de redimensionnement d'image du code, je peux redimensionner 1000 images en 45 secondes environ. Entrée 873x655 et redimensionnée et recadrée à 300x250. –
Quelque chose ne va pas. La bibliothèque [ImageResizer pour ASP.NET] (http://imageresizing.net) utilise GDI + en interne et a * beaucoup * de débit plus élevé. Je suppose que cela est dû à la façon dont les E/S sont gérées - mettre en mémoire tampon le flux de fichiers en mémoire avant de créer une instance Image/Bitmap élimine certaines failles de concurrence. –