Auto resize picturebox, la picturebox en mieux :)

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

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.