Comment recadrer et redimensionner l'image en une seule étape .NET
J'ai un fichier Image que je voudrais recadrer et redimensionner en même temps en utilisant le Système.Classe de dessin
Je suis en train de construire sur les idées contenues dans cet article :http://www.schnieds.com/2011/07/image-upload-crop-and-resize-with.html
Je suis en mesure de Recadrer et de Redimensionner séparément mais quand j'essaye de combiner le processus, je suis arriver de drôles de sortie.
Voici ce que j'ai essayé
using (System.Drawing.Bitmap _bitmap = new System.Drawing.Bitmap(w, h))
{
_bitmap.SetResolution(img.HorizontalResolution, img.VerticalResolution);
using (Graphics _graphic = Graphics.FromImage(_bitmap))
{
_graphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
_graphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
_graphic.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
_graphic.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
//Code used to crop
_graphic.DrawImage(img, 0, 0, w, h);
_graphic.DrawImage(img, new Rectangle(0, 0, w, h), x, y, w, h, GraphicsUnit.Pixel);
//Code I used to resize
_graphic.DrawImage(img, 0, 0, img.Width, img.Height);
_graphic.DrawImage(img, new Rectangle(0, 0, W_FixedSize, H_FixedSize), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
//continued...
}
}
Dans le code ci-dessus...il y a deux sections commenté...une culture et un pour les redimensionner.
Pour le recadrage, je passe dans la bonne coords et la largeur/hauteur de la partie de l'image à découper(x, y, w, h).
Je voudrais des cultures basées sur mes paramètres et dessiner l'image en fonction de la W_FixedSize et H_Fixed taille params.
- vous pouvez regarder le code source de imager.codeplex.com (environ 100 lignes) ou l'utiliser comme une dll
Vous devez vous connecter pour publier un commentaire.
Une chose que toutes les réponses manqué, c'est que l'image qui en résulte aura 50% transparent de 1 pixel de bordure autour de l'image, en raison d'un bug dans l'interface GDI.
Pour bien cadrer et redimensionner, vous devez appliquer les paramètres suivants à l'objet graphique:
Vous avez besoin de faire un ImageAttributes instance de fixer la frontière bug:
Ensuite, lors de l'appel de DrawImage, passer
ia
comme dernier paramètre.Si vous avez affaire à quelque PNG, TIFF, ou ICO images et de les convertir en un format qui ne prend pas en charge la transparence, vous devez également appeler g.Claire(bgcolor) avant d'appeler la fonction DrawImage.
Si vous êtes l'encodage au format jpeg, veillez à définir les paramètres de Qualité et de disposer de la EncoderParameters objet par la suite.
L'occurrence de Bitmap que vous êtes la lecture de verrouiller le fichier sous-jacent jusqu'à ce que après il est disposé. Si vous utilisez le FromStream méthode, vous devez garder le flux ouvert jusqu'à après l'occurrence de Bitmap est éliminé. Un bon moyen pour ce faire est le clone du flux dans un MemoryStream instance et de l'attribuer à l'image.Propriété Tag.
J'ai un liste plus complète de GDI+ recadrage & redimensionnement pour éviter les bugs sur mon blog.
J'ai l'habitude d'essayer de pousser les gens à utiliser mon imageresizing.net bibliothèque, comme il est conçu pour fonctionner en toute sécurité sur un site web avec des performances optimales. 1 ligne de code, et très peu de place pour l'erreur de l'utilisateur.
J'ai téléchargé Schnieds l'exemple de projet, et je dois dire que c'est un (inutilement) compliqué de faire les choses. Édition Non destructive est en réalité beaucoup plus facile, comme indiqué sur cet article. Il est facile à combiner avec Uploadify, bien que je ne couvre pas que sur le blog.
Aussi, re-codage de l'image pendant le téléchargement est très destructeur, à la fois pour les fichiers jpeg et png. La Validation est bonne, mais jeter l'instance après validation, ne pas ré-encoder. Schnieds' exemple aussi des fuites de mémoire par le biais de la undisposed occurrence de Bitmap - exécutant sur un serveur haut volume serait panne rapidement.
Je suis à l'aide de cette classe, j'ai écrit:
semble que vous devriez être en mesure de recadrer et de redimensionner avec un appel à DrawImage
Résolu le problème...
Je passais la largeur et la hauteur de la zone recadrée dans la déclaration que instatiates une nouvelle occurrence de bitmap.
Je l'ai corrigé par la création de l'objet bitmap dans le fixe souhaitée, la taille de l'image...
côté client utilisé http://jcrop.org/
http://jcrop.org/demos/basic
et Utilisé comme cela, dans le contrôleur de
Dans imageBytes vous obtiendrez recadrée et redimensionnée l'image. vous pouvez stocker l'image où vous voulez en db ou un dossier.