Introduction
Imaging Box is an advanced image control for Windows Form applications, it’s just like the famous PictureBox
with even more amazing features. This control allows to show images with advanced zoom options like stretch with aspect ratio, custom zoom ratio and zoom point. For example, you can make the control show image stretched with aspect ratio only if the image bounds are larger than the control bounds. Also, with extra render options like Interpolation mode and Compositing quality, hence this control renders using GDI+ directly and is built as a custom control and is not based on picture box, and make it as customizable as needed for developers and users. It also supports animated images (GIF) with the availability to zoom, stretch, etc. It also supports Right-to-Left by adjusting the vertical scroll bar.
“Zoom if larger” zooming with “Stretch to viewer” mode and “NearestNeighbor” filter.
“High Quality Bicubic” with aspect ratio zooming!!
Background
When you develop an application that requires the display of images in high quality with advanced features, and an imaging control is needed with features that normal PictureBox
control don't provide like Aspect ratio stretch; ImageBox
can solve that problem with even more advanced features like rendering filters.
Using the Code
ImageBox
is just a Windows Forms Control, thus, using it within your forms application is as simple as adding other controls when you design the form.
All you need to do is to include the ImageBox.dll (or ImageBox
project) into your project as reference, then the ImageBox
control should be listed in the Toolbox in Visual Studio’s form designer.
After that, change the Image
property to view the image you like. For example:
void OpenImageFile(string path)
{
try
{
this.imageBox1.Image = Image.FromFile(path);
}
catch (FileNotFoundException)
{
MessageBox.Show("File:\n" + path + "\nwas not found!");
}
}...
Don’t forget that you can use the Visual Studio forms designer to explore and change the options of this control in the properties box. The properties are:
InterpolationMode
: The interpolation mode that will be used for rendering the image CompositingQuality
: The compositing quality that will be used for rendering the image ScrollMode
: The scroll mode to use in scrolling, it can be:
Never
: Never show scroll bars Automatic
: Show scroll bars if image is larger than viewer Always
: Always show scroll bars
ZoomPoint
: Zoom point which is used to zoom around while applying zoom. The coordinates in use are control coordinates.
This is actually a very handy property and one of the main reasons I started this ImageBox
control. You can use this property to apply zoom on a certain location of the image, like if you want to zoom on the eye of someone's face. In this case, ImageBox
will move ViewPort
so that zoom point never moves while zooming.
StretchMode
: The stretch mode, it can be:
KeepAspectRatio
: Keep aspect ratio of the image StretchToViewerRatio
: Stretch the image to a new size where the image touches all sides of the viewer
ZoomMode
: The zoom style used for new images. Can be:
None
: No zoom, use the image as it is ZoomIfLarger
: Zooms the image in if it was larger than the viewer TouchViewerFromInside
: Zooms the image in or out so that the image touches the viewer from inside TocuhViewerFromOutside
: Zooms the image in or out so that the image touches the viewer from outside
ZoomRatio
: The zoom ratio. ImageBox
supports negative zoom ratios. In this case, image will be mirrored. Try it in the demo program. UseDefaultImageOnNull
: Gets or sets whether to display a default image if 'Image
' property was null
. Image
: Gets or sets image to be displayed. DefaultImage
: Get or set the default image to display when the 'Image
' property is null
.
Also, there are some hidden properties that could be changed in code (ImageRectangle
, ViewPortRectangle
and ViewPortLocation
), these properties are used internally for rendering.
The events are:
ImageChanged
: Raised when the Image
value is changed ZoomRatioChanged
: Raised when the ZoomRatio
value is changed ZoomModeChanged
: Raised when the ZoomMode
value is changed StretchModeChanged
: Raised when the StretchMode
value is changed ViewPortLocationChanged
: Raised when the ViewPortLocation
value is changed InterpolationModeChanged
: Raised when the InterpolationMode
value is changed CompositingQualityChanged
: Raised when the CompositingQuality
value is changed
ImageBox.dll also has a very helpful helper class: ImageHelper
.
This helper class provides extension methods to Image
, Rectangle
and Size
to apply zoom.
The demo project source makes a good example of how to use this control and all its features. It is actually a full preview program that can replace 'Preview' in Windows.
You can open or drop an image over it and navigate the folder in which the image is located while allowing you to custom render the image.
Few Words About the Design
ImageBox paint
method is very simple and will take _ImageToDraw
and _ImageToDrawRect
to draw the image in. _ImageToDraw
will be selected from _Image
or _DefaultImage
depending on the value of the property ImageBox.UseDefaultImageOnNull
_ImageToDrawRect
is exposed to external code as the property ImageBox.ImageRectangle
. You can apply any kind of stretch and zoom to this property and the image will be rendered accordingly. - Internally, setting
ImageBox.ImageRectangle
will invoke methods to adjust scroll bars and update ViewPort
as needed. ImageBox.ZoomRatio
property will produce a new rectangle and set it in ImageBox.ImageRectangle
. ImageBox.StretchMode
will take _ImageToDraw
and produces a stretched rectangle _StretchedImageRect
. ImageBox.ZoomMode
uses _StretchedImageRect
and calculates the appropriate zoom ratio, then applies it.
Supporting Negative Zoom
ImageBox.cs provides a conditional compiling variable PREVENT_REVERSED_IMAGE
.
In case you don't want to allow negative values for zoom, only compile the project with true value and code will raise exceptions in the case of using negative zoom or reversed images.
Supporting reversed images and negative values for zoom requires extra minor steps to draw the image. This will not actually produce any significant performance issues, however, if you wish to disable support for negative zoom, use this variable.
Points of Interest
The Image Box Control is simply another picture box with customizable zooming features and fast performance. It’s actually used in Emulators Organizer <http: emusorganizer="" projects="" sourceforge.net=""> application (maybe not this version of the control, depending on latest updates of the application) and proves its usability and stability.
Updated:
Ver 1.0.1
Fixed: Exception when changing ZoomMode in desgin mode: Added a check before excuting ApplyZoomMode
Many thanks for 'larclap' for pointing out the bug.
Added: Support of command line in DemoViewer
Added: Switch Zoom Mode button: Fast Switch zoom mode between None and the last zoom mode.
Ver 1.0.2
Fixed: Exception when minimizing the window that contains the ImageBox control.