Support for loading large amount of items in an ImageViewer.
public abstract class ImageViewerVirtualizer Public MustInherit Class ImageViewerVirtualizer public ref class ImageViewerVirtualizer abstract The ImageViewerVirtualizer provide support for handling large amount of image data in an ImageViewer by loading and unloading item data on demand with full control for rendering place-holders and controlling the number of items to cache in memory.
For detailed information, refer to Image Viewer Virtualizer.
using Leadtools;using Leadtools.Controls;using Leadtools.Codecs;using Leadtools.Drawing;public void ImageViewerVirtualizer_Example(){string imageFileName = GetExampleImageFile();// Create a new form to test out virtualizerMyForm form = new MyForm(imageFileName);form.ShowDialog();}private static string GetExampleImageFile(){string imageFileName = Path.Combine(LEAD_VARS.ImagesDir, "ImageViewerVirtualizerExample.tif");// Check if it is previously created, return itif (File.Exists(imageFileName))return imageFileName;// Create an image that has many pages, we will use that for out testingconst int pageCount = 100;const int imageWidth = 800;const int imageHeight = 800;var rc = new Rectangle(0, 0, imageWidth, imageHeight);using (RasterCodecs codecs = new RasterCodecs())using (Font font = new Font(FontFamily.GenericMonospace, 80)){for (int page = 1; page <= pageCount; page++){using (RasterImage image = RasterImage.Create(imageWidth, imageHeight, 24, 96, RasterColor.FromKnownColor(RasterKnownColor.White))){IntPtr hdc = RasterImagePainter.CreateLeadDC(image);using (Graphics graphics = Graphics.FromHdc(hdc)){graphics.DrawRectangle(Pens.Blue, 0, 0, rc.Width - 1, rc.Height - 1);TextRenderer.DrawText(graphics, "Page " + page.ToString(), font, rc, Color.Red, TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter);}RasterImagePainter.DeleteLeadDC(hdc);codecs.Save(image, imageFileName, RasterImageFormat.TifLzw, 0, 1, -1, -1, page == 1 ? CodecsSavePageMode.Overwrite : CodecsSavePageMode.Append);}}}return imageFileName;}// Custom Virtualizerpublic class MyVirtualizer : ImageViewerVirtualizer{private string _imageFileName;public MyVirtualizer(string imageFileName) :base(){_imageFileName = imageFileName;// We will load 4 items at a timethis.MaximumItems = 4;}protected override object LoadItem(ImageViewerItem item){// Load a page, the page number is the item index + 1, but it// could be anything in your application, for example// using ImageViewerItem.Tag to store the necessary data to identity this itemint pageNumber = this.ImageViewer.Items.IndexOf(item) + 1;using (RasterCodecs codecs = new RasterCodecs()){return codecs.Load(_imageFileName, pageNumber);}}protected override void SaveItem(ImageViewerItem item, object data){// Nothing to do in this application, just log it.// If save is required, then this is the place to do itint pageNumber = this.ImageViewer.Items.IndexOf(item) + 1;System.Diagnostics.Debug.WriteLine("SaveItem for page {0} is called");}protected override void DeleteItem(ImageViewerItem item, object data){// Dispose the imageRasterImage image = data as RasterImage;if (image != null)image.Dispose();}protected override void RenderItemPlaceholder(ImageViewerRenderEventArgs e){// Render the place holder for this pageint pageNumber = this.ImageViewer.Items.IndexOf(e.Item) + 1;LeadMatrix transform = this.ImageViewer.GetItemImageTransform(e.Item);Graphics graphics = e.PaintEventArgs.Graphics;// Render the message at 0,0 in this item transformationLeadPointD pt = LeadPointD.Create(0, 0);pt = transform.Transform(pt);string message = string.Format("Loading page {0}...", pageNumber);graphics.DrawString(message, this.ImageViewer.Font, Brushes.Black, (float)pt.X, (float)pt.Y);}}// Form to test the virtualizerclass MyForm : Form{public MyForm(string imageFileName){_imageFileName = imageFileName;}private ImageViewer _imageViewer;private string _imageFileName;protected override void OnLoad(EventArgs e){// Create a new image viewer with vertical layout_imageViewer = new ImageViewer(new ImageViewerVerticalViewLayout { Columns = 1 });_imageViewer.BackColor = Color.Bisque;_imageViewer.Dock = DockStyle.Fill;// Add pan zoom interactive mode_imageViewer.InteractiveModes.Add(new ImageViewerPanZoomInteractiveMode());this.Controls.Add(_imageViewer);_imageViewer.BringToFront();// Add empty items, each one with the correct size but withusing (RasterCodecs codecs = new RasterCodecs()){int pageCount;LeadSize pageSize;LeadSizeD pageResolution;using (CodecsImageInfo info = codecs.GetInformation(_imageFileName, true)){pageCount = info.TotalPages;pageSize = LeadSize.Create(info.Width, info.Height);pageResolution = LeadSizeD.Create(info.XResolution, info.YResolution);}_imageViewer.BeginUpdate();for (int page = 1; page <= pageCount; page++){// no image data, the virtualizer will take care of loading the pages and rendering themImageViewerItem item = new ImageViewerItem();item.ImageSize = pageSize;item.Resolution = pageResolution;_imageViewer.Items.Add(item);}_imageViewer.EndUpdate();}// Finally, set our virtualizer so it can start working_imageViewer.Virtualizer = new MyVirtualizer(_imageFileName);// Run the demo, use pan (drag) and zoom (CTRL-CLICK and drag) to show the items// Note how they get loaded when they are in view// Change the number of MaximumItems to see its effect.base.OnLoad(e);}}static class LEAD_VARS{public const string ImagesDir = @"C:\LEADTOOLS21\Resources\Images";}
Imports LeadtoolsImports Leadtools.ControlsImports Leadtools.CodecsImports Leadtools.DrawingImports LeadtoolsControlsExamples.LeadtoolsExamples.CommonPublic Sub ImageViewerVirtualizer_Example()Dim imageFileName As String = GetExampleImageFile()' Create a new form to test out virtualizerDim form As MyForm = New MyForm(imageFileName)form.ShowDialog()End SubPrivate Shared Function GetExampleImageFile() As StringDim imageFileName As String = Path.Combine(ImagesPath.Path, "ImageViewerVirtualizerExample.tif")' Check if it is previously created, return itIf File.Exists(imageFileName) ThenReturn imageFileNameEnd If' Create an image that has many pages, we will use that for out testingConst pageCount As Integer = 100Const imageWidth As Integer = 800Const imageHeight As Integer = 800Dim rc As New Rectangle(0, 0, imageWidth, imageHeight)Using codecs As RasterCodecs = New RasterCodecs()Using font As Font = New Font(FontFamily.GenericMonospace, 80)For page As Integer = 1 To pageCountUsing image As RasterImage = RasterImage.Create(imageWidth, imageHeight, 24, 96, RasterColor.FromKnownColor(RasterKnownColor.White))Dim hdc As IntPtr = RasterImagePainter.CreateLeadDC(image)Using graphics As Graphics = graphics.FromHdc(hdc)graphics.DrawRectangle(Pens.Blue, 0, 0, rc.Width - 1, rc.Height - 1)TextRenderer.DrawText(graphics, "Page " & page.ToString(), font, rc, Color.Red, TextFormatFlags.HorizontalCenter Or TextFormatFlags.VerticalCenter)End UsingRasterImagePainter.DeleteLeadDC(hdc)If page = 1 Thencodecs.Save(image, imageFileName, RasterImageFormat.TifLzw, 0, 1, -1, -1, CodecsSavePageMode.Overwrite)Elsecodecs.Save(image, imageFileName, RasterImageFormat.TifLzw, 0, 1, -1, -1, CodecsSavePageMode.Append)End IfEnd UsingNext pageEnd UsingEnd UsingReturn imageFileNameEnd Function' Custom VirtualizerPublic Class MyVirtualizer : Inherits ImageViewerVirtualizerPrivate _imageFileName As StringPublic Sub New(ByVal imageFileName As String)MyBase.New()_imageFileName = imageFileName' We will load 4 items at a timeMe.MaximumItems = 4End SubProtected Overrides Function LoadItem(ByVal item As ImageViewerItem) As Object' Load a page, the page number is the item index + 1, but it' could be anything in your application, for example' using ImageViewerItem.Tag to store the necessary data to identity this itemDim pageNumber As Integer = Me.ImageViewer.Items.IndexOf(item) + 1Using codecs As RasterCodecs = New RasterCodecs()Return codecs.Load(_imageFileName, pageNumber)End UsingEnd FunctionProtected Overrides Sub SaveItem(ByVal item As ImageViewerItem, ByVal data As Object)' Nothing to do in this application, just log it.' If save is required, then this is the place to do itDim pageNumber As Integer = Me.ImageViewer.Items.IndexOf(item) + 1System.Diagnostics.Debug.WriteLine("SaveItem for page {0} is called")End SubProtected Overrides Sub DeleteItem(ByVal item As ImageViewerItem, ByVal data As Object)' Dispose the imageDim image As RasterImage = TryCast(data, RasterImage)If Not image Is Nothing Thenimage.Dispose()End IfEnd SubProtected Overrides Sub RenderItemPlaceholder(ByVal e As ImageViewerRenderEventArgs)' Render the place holder for this pageDim pageNumber As Integer = Me.ImageViewer.Items.IndexOf(e.Item) + 1Dim transform As LeadMatrix = Me.ImageViewer.GetItemImageTransform(e.Item)Dim graphics As Graphics = e.PaintEventArgs.Graphics' Render the message at 0,0 in this item transformationDim pt As LeadPointD = LeadPointD.Create(0, 0)pt = transform.Transform(pt)Dim message As String = String.Format("Loading page {0}...", pageNumber)graphics.DrawString(message, Me.ImageViewer.Font, Brushes.Black, CSng(pt.X), CSng(pt.Y))End SubEnd Class' Form to test the virtualizerPrivate Class MyForm : Inherits FormPublic Sub New(ByVal imageFileName As String)_imageFileName = imageFileNameEnd SubPrivate _imageViewer As ImageViewerPrivate _imageFileName As StringProtected Overrides Sub OnLoad(ByVal e As EventArgs)' Create a new image viewer with vertical layoutDim viewLayout As New ImageViewerVerticalViewLayoutviewLayout.Columns = 1Dim _imageViewer As New ImageViewer(viewLayout)_imageViewer.BackColor = Color.Bisque_imageViewer.Dock = DockStyle.Fill' Add pan zoom interactive mode_imageViewer.InteractiveModes.Add(New ImageViewerPanZoomInteractiveMode())Me.Controls.Add(_imageViewer)_imageViewer.BringToFront()' Add empty items, each one with the correct size but withUsing codecs As RasterCodecs = New RasterCodecs()Dim pageCount As IntegerDim pageSize As LeadSizeDim pageResolution As LeadSizeDUsing info As CodecsImageInfo = codecs.GetInformation(_imageFileName, True)pageCount = info.TotalPagespageSize = LeadSize.Create(info.Width, info.Height)pageResolution = LeadSizeD.Create(info.XResolution, info.YResolution)End Using_imageViewer.BeginUpdate()Dim page As Integer = 1Do While page <= pageCount' no image data, the virtualizer will take care of loading the pages and rendering themDim item As ImageViewerItem = New ImageViewerItem()item.ImageSize = pageSizeitem.Resolution = pageResolution_imageViewer.Items.Add(item)page += 1Loop_imageViewer.EndUpdate()End Using' Finally, set our virtualizer so it can start working_imageViewer.Virtualizer = New MyVirtualizer(_imageFileName)' Run the demo, use pan (drag) and zoom (CTRL-CLICK and drag) to show the items' Note how they get loaded when they are in view' Change the number of MaximumItems to see its effect.MyBase.OnLoad(e)End SubEnd Class
Help Collections
Raster .NET | C API | C++ Class Library | HTML5 JavaScript
Document .NET | C API | C++ Class Library | HTML5 JavaScript
Medical .NET | C API | C++ Class Library | HTML5 JavaScript
Medical Web Viewer .NET
Multimedia
Direct Show .NET | C API | Filters
Media Foundation .NET | C API | Transforms
Supported Platforms
.NET, Java, Android, and iOS/macOS Assemblies
Imaging, Medical, and Document
C API/C++ Class Libraries
Imaging, Medical, and Document
HTML5 JavaScript Libraries
Imaging, Medical, and Document
