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.
OriginalL'auteur Jan Zich | 2009-08-04
Vous devez vous connecter pour publier un commentaire.
Avez-vous regardé le WriteableBitmapEx projet? C'est un projet open source avec une tonne de méthodes d'extension pour le
WriteableBitmap
classe. Voici comment redimensionner:OriginalL'auteur Chris S
Je ne connais pas les détails ici, mais si vous avez des fuites de ressources - on pourrait voir qui de vos objets implémente l'interface IDisposable. Je suppose que le Flux d'Image et de classes implémentent cette interface. Et si elles le font, appel Dispose () (ou en l'enveloppant de leur utilisation dans une "Aide" déclaration) sera la cause de la gratuité de leurs ressources immédiatement plutôt que d'attendre que le garbage collector à coup de pied par la suite.
OriginalL'auteur GeekyMonkey