11
votes

Comment puis-je redimensionner dynamiquement une image dans ASP.NET MVC?

question

Comment puis-je redimensionner de manière dynamique une image dans ASP.NET MVC?

Fond

J'essaie de créer automatiquement des vignettes à partir d'images déjà sur le serveur. Dans ASP.NET WebForms, j'ai créé un httphandler pour le faire et ajouté verbes dans le web.config pour toutes les extensions d'image pour traverser le gestionnaire. Le gestionnaire était agréable dans ce que si vous vouliez l'image d'origine, vous utiliseriez une étiquette d'image typique:

Mais si vous vouliez une image redimensionnée, vous utiliseriez:

existe-t-il un moyen de dupliquer le même comportement dans ASP.NET MVC?


3 commentaires

Contrairement à un HTTPHANDLER, un httpmodule fonctionnera de manière transparente avec MVC et WebForms. L'image la plus populaire Redimensionnement HTTPMODULE pour ASP.NET est Imageresizing.net . C'est gratuit, open-source et infaillible.


Cool merci. Malheureusement, Imageresizing.net n'était pas là en 2009 quand j'ai posé la question.


C'était en fait. Été autour depuis 2007. Mais dans toute l'équité, cela n'a pas compris la page 1 de Google jusqu'au début de 2009 ...


3 Réponses :


0
votes

Vous pouvez faire la même chose en MVC. Vous pouvez utiliser un HTTPHANDLER comme vous l'avez fait avant ou vous créez une action qui diffuse l'image redimensionnée.

Si c'était moi, je créerais un contrôleur avec une méthode de redimensionnement.


6 commentaires

Pouvez-vous élaborer sur ce que vous avez dit sur la création d'une action qui diffuse l'image redimensionnée?


Attends, je pense que je l'obtiens. Vous voulez utiliser RedirectToaction ("Thumbnail") qui retourne une vignette, non?


Je ne suis pas chez mon ordinateur, mais il existe une méthode de "contenu" qui diffuse des données. Je crois que cela a une signature qui prend un tableau de flux ou d'octet, puis a un paramenteur pour le type de contenu. Pour le type de contenu, vous passeriez "image / jpg". Ensuite, tout ce dont vous avez besoin est de faire référence à l'action dans un élément d'image HTML.


Ce qui précède suppose que vous avez déjà redimensionné l'image en mémoire comme un ruisseau OY Oyte []


Je préférerais beaucoup la vue de redimensionner l'image. Mon opinion est que le contrôleur ne doit donner qu'à l'affichage d'une "table" de données à afficher, dans ce cas, une liste de toutes les images correspondant à un critère, et c'est le travail de la vue pour gérer l'image de redimensionnement, si nécessaire.


Si vous allez descendre une réponse, la courtoisie est de laisser un commentaire. C'est un peu absurde de descendre une réponse écrite il y a 3 ans. La valeur de déplacement est ajoutée en fournissant votre propre réponse.



3
votes

Vous pouvez définitivement réutiliser le même ihttphandler . Vous avez juste besoin d'un nouveau IrouteHandler à map La demande entrante au bon gestionnaire: xxx

dans vos itinéraires, ajoutez: xxx

maintenant toute demande dans / images < / Code> (par exemple, /images/pic.jpg?width=320&height=240 ) sera géré par votre gestionnaire existant. Évidemment, vous pouvez changer le modèle de route pour correspondre à n'importe quel chemin qui a du sens, comme un itinéraire MVC typique.


5 commentaires

Ce code fonctionnera-t-il pour les sous-répertoires sous le dossier Images?


@Danielt Oui! Voir la petite modification à ma réponse - Ajout de l'astérisque à {* Fichier} aura cette route tout attraper sous / Images, y compris les sous-répertoires.


Hmm, léger problème: ce routage ne fonctionne que si je saisis manuellement l'URL dans la barre d'adresse, comme: http: // localhost: 4692 / contenu / images / img_0146.jpg . Cependant, j'ai besoin d'intégrer l'image à l'intérieur d'une vue et il ne passe pas le gestionnaire de routage car il a déjà été acheminé vers le contrôleur.


@Danielt hmm, pas sûr de ce que tu veux dire. Chaque ressource sur la page, telle que , est envoyée au serveur par le navigateur comme une demande distincte, et chacune sera traitée séparément. Pouvez-vous décrire ce que vous voyez plus en détail?


Qu'en est-il des images qui sont en CSS comme images d'arrière-plan?



12
votes

Utilisation de WebImage CODE> Classe qui se trouve dans system.web.helpers.webimage code> Vous pouvez y parvenir.

Vous pouvez utiliser ce grand enfant pour produire des images redimensionnées à la volée . p>

échantillon code: p> xxx pré>

dans une vue, vous auriez quelque chose comme ceci: p>

<img src="@Url.Action("GetPhotoThumbnail",
     new { realtyId = item.Id, width = 100, height = 100 })" />


0 commentaires