Auto resize picturebox, la picturebox en mieux :)

Soyez le premier à donner votre avis sur cette source.

Vue 17 500 fois - Téléchargée 1 239 fois

Description

Un petit composant sympa qui (modéstement !) comble les défauts de l'objet PictureBox du Framework .NET
L'image est redimenssionée pour être affichée (en conservant le rapport hauteur/largeur) à la taille de la PictureBox.
Une option permet de centrer l'image ou non.
Je n'en dis pas plus car le code est commenté.
Ce composant est fait pour être intégré directement dans la boite à outil de votre visual studio afin d'en faciliter l'utilisation ! Un vrai jeu d'enfant !

Le composant est livré avec une application démo !

Source / Exemple :


using System;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;

namespace AutoResizePictureBox
{
	/// <summary>
	/// AutoResizePictureBox permet de garder le rapport hauteur/largeur d'une image lorsqu'elle est affichée.
	/// </summary>
	public class PictureBoxAR : PictureBox
	{
		#region Attributs
		private int maxBmpHeight;
		private int maxBmpWidth;
		private Size imageSize;
		private int top = 0;
		private int left = 0;
		private bool autoChangeMaxSize;
		private bool centerImage = true;
		[Category("Property Changed"), Description("Evènement déclenché quand la valeur de la propriété Image est changée sur le composant")]
		public event EventHandler ImageChanged;
		#endregion

		#region Accesseurs
		[Category("Behavior"), Description("Détermine si le composant doit recalculer la taille de l'image lorsqu'il a été redimmensionné"), DefaultValue(true)]
		public bool AutoChangeMaxSize
		{
			get
			{
				return this.autoChangeMaxSize;
			}
			set
			{
				this.autoChangeMaxSize = value;
				this.Refresh();
			}
		}
		[Category("Behavior"), Description("Détermine si le composant doit center l'image"), DefaultValue(true)]
		public bool CenterImage
		{
			get
			{
				return this.centerImage;
			}
			set
			{
				this.centerImage = value;
				this.Refresh();
			}
		}

		public new Image Image
		{
			get
			{
				return base.Image;
			}
			set
			{
				base.Image = value;
				this.ImageChanged(this, new EventArgs());
			}
		}
		
		#endregion

		#region Constructeurs
		/// <summary>
		/// Créé une nouvelle instance du composant PictureBoxAR (Constructeur utilisé par VS en mode designer)
		/// </summary>
		public PictureBoxAR() : base()
		{
			this.ImageChanged += new EventHandler(PictureBoxEx_ImageChanged);
			this.Resize += new EventHandler(PictureBoxAR_Resize);
			this.autoChangeMaxSize = true;
		}

		/// <summary>
		/// Créé une nouvelle instance du composant PictureBoxAR.
		/// Lorsque la taille maximum de l'image est précisée, elle ne sera pas recalculée automatiquement en cas de
		/// redimmenssionement du composant
		/// </summary>
		/// <param name="maximumWidth">Précise la largeur maximum de l'image</param>
		/// <param name="maximumHeight">Précise la hauteur maximum de l'image</param>
		public PictureBoxAR(int maximumWidth, int maximumHeight) : base()
		{
			this.ImageChanged += new EventHandler(PictureBoxEx_ImageChanged);
			this.maxBmpHeight = maximumHeight;
			this.maxBmpWidth = maximumWidth;
			this.autoChangeMaxSize = false;
		}

		#endregion

		#region Méthodes privées
		private void ComputeSizeAndInitialPosition()
		{
			this.ComputeImageSize();
			this.ComputeInitialPosition();			
		}

		private void ComputeInitialPosition()
		{
			try
			{
				if (this.centerImage == false)
					left = top = 0;
				else
				{
					left = (this.Width - imageSize.Width)/2;
					top  = (this.Height - imageSize.Height)/2;
				}
			}
			catch (Exception)
			{
				left = 0;
				top = 0;
			}
		}

		private void ComputeImageSize()
		{
			if (this.Image != null)
			{
				if (Image.Height > Image.Width) 
					imageSize = new Size(((Image.Width * maxBmpHeight)/Image.Height), maxBmpHeight);
				else
					imageSize = new Size(maxBmpWidth, ((Image.Height * maxBmpWidth)/Image.Width));
			}
			else
				imageSize = Size.Empty;
		}

		private void ChangeMaxSize()
		{
			if (this.autoChangeMaxSize)
			{
				this.maxBmpHeight = this.ClientRectangle.Height;
				this.maxBmpWidth = this.ClientRectangle.Width;
			}
		}
		#endregion

		#region Méthodes overridées
		protected override void OnPaint(PaintEventArgs e)
		{
			if (this.Image != null)
			{
				Graphics g = e.Graphics;
				g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
				g.DrawImage(this.Image, new Rectangle(left, top, imageSize.Width, imageSize.Height),
										new Rectangle(0, 0, this.Image.Width, this.Image.Height),
										GraphicsUnit.Pixel);
			}
		}

		public override void Refresh()
		{
			this.ChangeMaxSize();
			this.ComputeSizeAndInitialPosition();
			base.Refresh();
		}

		#endregion

		#region Events
		private void PictureBoxEx_ImageChanged(object sender, EventArgs e)
		{
			this.ComputeSizeAndInitialPosition();
		}

		private void PictureBoxAR_Resize(object sender, EventArgs e)
		{
			this.Refresh();
		}
		#endregion
	}
}

Conclusion :


Pas grand chose à rajouter...
Je vais publier une nouvelle version dans peu de temps qui offrira un peu plus d'option (le positionnnement de l'image dans la PictureBox, l'utilisation de tel ou tel algorithme d'interpolation, ...) et qui surtout sera optimisée !

Stay tuned :)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

micking
Messages postés
38
Date d'inscription
samedi 22 août 2009
Statut
Membre
Dernière intervention
29 août 2016
-
je voudrai savoir si je peut faire un auto-resize de l'ensemble de ma page web? si jamais où dois-je me renseigné ?
micking
Messages postés
38
Date d'inscription
samedi 22 août 2009
Statut
Membre
Dernière intervention
29 août 2016
-
(ctrl-maj-z) c'est mieux !
micking
Messages postés
38
Date d'inscription
samedi 22 août 2009
Statut
Membre
Dernière intervention
29 août 2016
-
"(CTRL) Roulette avant-arrière j'adore"
manoxide
Messages postés
3
Date d'inscription
vendredi 15 février 2008
Statut
Membre
Dernière intervention
30 mars 2008
-
Bravo pour le composant!

Je peux suggèrer une fonction qui serait grandement agréable ?

Un GetImage qui récupère le Bitmap tel que vue à l'affichage. Donc, une photo redimensionné, croqué et prêt à être imprimé :)

Cordialement,
projetf
Messages postés
26
Date d'inscription
dimanche 15 avril 2007
Statut
Membre
Dernière intervention
27 avril 2009
-
JE CHERCHE A POUVOIR REDIMENSIONNER L'IMAGE CELON MON CHOI CAD AGRANDIR OU DIMINUNIR LA TAILLE DE L'IMAGE ....

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.