Redimensionnement des images dans Silverlight 3 à l'aide de WriteableBitmap

C'est mon premier jour avec Silverlight. Je suis en train de créer le prototype d'une application qui (entre autres fonctions) devrait être en mesure de redimensionner l'utilisateur des images fournies. Il doit être capable de gérer et d'afficher plusieurs images redimensionnées à la fois. Le plus évident des approches que j'ai essayé semblent "fuite de mémoire" dans le sens qu'à l'origine, les bitmaps sont encore référencée, d'une certaine façon ce qui provoque Silverlight pour distribuer des centaines de mégaoctets de mémoire après un certain temps. Je veux juste être en mesure de charger les images une par une, de les redimensionner et de garder les petites versions.

Pour être précis, j'ai essayé le suivant:

  • Création d'une liste de System.Windows.Controls.Image's (et mise à l'échelle). Je ne suis pas surpris que cela n'a pas fonctionné.
  • La création d'une liste de rectangles remplis par l'image les pinceaux. Je ne suis pas surpris non plus.
  • Rendu le bitmap dans System.Windows.Media.Imaging.WriteableBitmap. Je m'attendais à cette à bien; je suppose que les images sont vraiment juste de dessiner directement et pas référencé d'aucune façon. Cependant, la consommation de mémoire d'indication contraire.

Voici un extrait de la pièce de code:

//create image source
Stream stream = file.OpenRead();
BitmapImage bmpImg = new BitmapImage();
bmpImg.SetSource(stream);
stream.Close();

//create temporary image from it
Image tmpImg = new Image();
tmpImg.Source = bmpImg;

//this is required by WriteableBitmap 
tmpImg.Measure(new Size(100, 100));
tmpImg.Arrange(new Rect(0, 0, 100, 100));

//prepare scaling to 100x100
ScaleTransform scaleTrans = new ScaleTransform();
double scale = (double)100 / (double)Math.Max(bmpImg.PixelHeight, bmpImg.PixelWidth);
scaleTrans.CenterX = 0;
scaleTrans.CenterY = 0;
scaleTrans.ScaleX = scale;
scaleTrans.ScaleY = scale;

//render
WriteableBitmap writeableBitmap = new WriteableBitmap(100, 100);
writeableBitmap.Render(tmpImg, scaleTrans);
writeableBitmap.Invalidate();

//final image
Image img = new Image();
img.Source = writeableBitmap;

J'espère que je ne suis pas de manquer quelque chose de stupide, mais il semble OK pour moi et fait la bonne chose (à l'exception du problème de mémoire). Veuillez également garder à l'esprit que la qualité du code n'est pas censé être une production de qualité; c'est juste un moyen rapide et sale prototype.

J'ai remarqué que je ne suis pas seule, j'ai trouvé les questions liées à la manipulation de l'image dans Silverlight. Je suis également consciente du fait que je pourrais utiliser de la troisième partie de la bibliothèque, faire du traitement sur le serveur ou écrire quelque chose de moi-même, mais je suis surpris que Silverlight n'offre pas de base fonctions de manipulation d'images. Il ne semble pas être d'une rare exigence où Silverlight se positionne.

En général, les gens sont à l'aide de bibliothèques telles que la FJCore code dans le code.google.com/p/fjcore pour l'instant afin de combler cette lacune dans l'intervalle. Votre dernier paragraphe où vous offrons un poste ou une déclaration sur Silverlight enlève rien à la question.

OriginalL'auteur Jan Zich | 2009-08-04