Calculates how an image is to be sized and positioned in a rectangle while keeping the aspect ratio fixed.
public static Rectangle GetFixedAspectRatioImageRectangle(int imageWidth,int imageHeight,Rectangle imageRect)
imageWidth
Width of the image in pixels
imageHeight
Height of the image in pixels
imageRect
The source rectangle
A System.Drawing.Rectangle structure that specifies where the image is to be positioned and sized in imageRect while keeping the aspect ratio fixed.
When the RasterImageList class draws an item image, it tries to fit the image into the item image rectangle while maintaining the aspect ratio. The control internally calls this method to calculate these values.
using Leadtools.WinForms;using Leadtools;using Leadtools.Codecs;using Leadtools.Drawing;class MyForm3 : Form{RasterImageList imageList;RasterCodecs codecs;public MyForm3(string title){Text = title;// Set the size of the formSize = new Size(400, 200);// Create a new RasterImageList controlimageList = new RasterImageList();imageList.Dock = DockStyle.Fill;imageList.SelectionMode = RasterImageListSelectionMode.Single;imageList.Size = Size;Controls.Add(imageList);imageList.BringToFront();codecs = new RasterCodecs();// Create three itemsstring imagesPath = LEAD_VARS.ImagesDir;for (int i = 0; i < 3; i++){// Load the imageint index = i + 1;string imageFileName = Path.Combine(imagesPath, @"ImageProcessingDemo\Image" + index.ToString() + ".cmp");RasterImage image = codecs.Load(imageFileName, 0, CodecsLoadByteOrder.BgrOrGray, 1, 1);RasterImageListItem item = new RasterImageListItem(image, 1, "Item" + index.ToString());// Select the first itemif (i == 0)item.Selected = true;// Add the item to the image listimageList.Items.Add(item);}// Change the item sizeimageList.ItemSize = new Size(200, 200);// Change the item image sizeimageList.ItemImageSize = new Size(120, 120);// We are going to draw the items ourselvesimageList.ViewStyle = RasterImageListViewStyle.OwnerDraw;// Add a handler to the DrawItem eventimageList.DrawItem += new EventHandler<RasterImageListDrawItemEventArgs>(rasterImageList_DrawItem);// Add the RasterImageList to the control collection.Controls.Add(imageList);}private void rasterImageList_DrawItem(object sender, RasterImageListDrawItemEventArgs e){RasterImageListItem item = e.Item;RasterImageList imageList = item.ImageList;Graphics g = e.Graphics;// get the item rectangleRectangle rc = imageList.GetItemRectangle(item);// sanity checkif (rc.IsEmpty)return;// we want to draw a 1 pixel black rectangle around the item// then we fill the inside of the rectangle with white if the item// is not selected or lightgray if it isg.DrawRectangle(Pens.Black, rc.Left, rc.Top, rc.Width - 1, rc.Height - 1);// we used up 1 pixelrc.Inflate(-1, -1);Brush b;if (item.Selected)b = Brushes.LightGray;elseb = Brushes.White;g.FillRectangle(b, rc);// calculate the rectangles for image and textif (imageList.ShowItemText){// text is visible// draw the text at the bottom of the itemint textHeight = (int)(g.MeasureString("WWW", imageList.Font).Height + 4);Rectangle textRect = Rectangle.FromLTRB(rc.Left,rc.Bottom - textHeight,rc.Right,rc.Bottom);if (!textRect.IsEmpty){StringFormat sf = new StringFormat();sf.Alignment = StringAlignment.Center;sf.LineAlignment = StringAlignment.Center;sf.Trimming = StringTrimming.EllipsisPath;sf.FormatFlags = StringFormatFlags.NoWrap;g.DrawString(item.Text,imageList.Font,Brushes.Black,textRect,sf);sf.Dispose();// we need to update the item rectangle for the space// we used up to draw the textrc.Height -= textRect.Height;}}// rc is the image rectangleif (!rc.IsEmpty){// now rc holds the rectangle to draw the image into// first, set the correct pageint savePage = -1;if (item.Image.Page != item.Page){// the page is different// save current image page so we can set it back when we are donesavePage = item.Image.Page;// disable the image events, we are going to set the page back,// so we do not want anybody subscribing to this image Changed// event to know we changed it.item.Image.DisableEvents();// set new pageitem.Image.Page = item.Page;}try{// we want to center the image into whatever left of rcSize itemImageSize = imageList.ItemImageSize;Rectangle imageRect = new Rectangle(rc.Left + (rc.Width - itemImageSize.Width) / 2,rc.Top + (rc.Height - itemImageSize.Height) / 2,itemImageSize.Width,itemImageSize.Height);// we want to keep the aspect ratioimageRect = RasterImageList.GetFixedAspectRatioImageRectangle(item.Image.ImageWidth,item.Image.ImageHeight,imageRect);// draw the imageLeadRect lRect = new LeadRect(imageRect.Left, imageRect.Top, imageRect.Width, imageRect.Height);RasterImagePainter.Paint(item.Image, e.Graphics, lRect, imageList.PaintProperties);// finally, draw a black rectangle around the imageimageRect.Inflate(1, 1);g.DrawRectangle(Pens.Black,imageRect.Left,imageRect.Top,imageRect.Width - 1,imageRect.Height - 1);}finally{// reset the old pageif (savePage != -1){item.Image.Page = savePage;// re-enable the eventsitem.Image.EnableEvents();}}}}}public void RasterImageList_DrawItem(string title){MyForm3 form = new MyForm3(title);form.ShowDialog();}static class LEAD_VARS{public const string ImagesDir = @"C:\LEADTOOLS22\Resources\Images";}