Navigation lors de l'affichage d'images très grandes en .NET

Catégorie du blog: Imagerie.NET

13.05.2020

Cet article décrit comment utiliser la classe ImageMapTool du VintaSoft Imaging .NET SDK pour visualiser des images de grande et très grande taille.

Prenons comme exemple une image JPEG2000 de 4 067 mégapixels (35 878 × 113 378 pixels).
Voici une capture d'écran d'une image JPEG2000 avec un zoom de 1% dans VintaSoft Imaging Demo:
Very large JPEG2000 image with 1% zoom in VintaSoft Imaging Demo

Voici une capture d'écran d'une image JPEG2000 avec un zoom de 10% dans VintaSoft Imaging Demo:
Very large JPEG2000 image with 10% zoom in VintaSoft Imaging Demo

Lors de l'affichage d'une très grande image, il est souvent difficile de déterminer la partie de l'image sur laquelle on se trouve et comment se déplacer pour atteindre l'emplacement souhaité. Ce problème peut généralement être résolu en réduisant la taille de l'image, puis… L'agrandissement de la zone souhaitée est possible. Cependant, si le décodage de l'image est gourmand en ressources, le temps d'exécution peut devenir inacceptable. L'utilisation d'une carte d'image via la classe ImageMapTool constitue une solution simple et élégante à ce problème.

Dans la VintaSoft Imaging Demo, la carte d'image peut être activée via le menu "View -> Image Map Settings...". La capture d'écran ci-dessous illustre ces paramètres dans la VintaSoft Imaging Demo:
Default image map settings in VintaSoft Imaging Demo


En réalité, la carte d'images est une petite visionneuse d'images située au-dessus de la visionneuse principale. Elle affiche la même image, mais avec un mode de mise à l'échelle différent. La capture d'écran ci-dessous montre les paramètres de la carte d'image avec un facteur d'échelle de 1/25 par rapport au facteur de zoom actuel de la visionneuse d'images principale:
Image map settings with custom scale factor in VintaSoft Imaging Demo


ImageMapTool classe:

La propriété ImageViewer.ViewerBufferSize permet de spécifier la taille, en mégapixels, du rectangle de la zone entièrement mise en cache autour de la zone visible (rectangle jaune) dans la visionneuse d'images. La capture d'écran ci-dessous illustre les paramètres de la visionneuse d'images avec une zone mise en cache de 6 mégapixels autour de la zone visible:
Image viewer settings with custom size of cached area around visible area in image viewer



De plus, pour les images de très grande taille, il est possible d'utiliser simultanément plusieurs éléments ImageMapTool dans la visionneuse d'images, chacun avec une échelle relative différente. Ceci est possible grâce à la classe CompositeVisualTool, qui permet de combiner les fonctionnalités de plusieurs outils visuels.
Voici un code C# qui montre comment créer 2 cartes d'image dans la visionneuse d'images:
// create the first image map tool
Vintasoft.Imaging.UI.VisualTools.ImageMapTool imageMap1 = new Vintasoft.Imaging.UI.VisualTools.ImageMapTool();
// specify that image map must be enabled
imageMap1.Enabled = true;
// specify that image map tool must show image in best fit mode
imageMap1.Zoom = 0;
// specify that image map must have size 200x200 pixels
imageMap1.Size = new System.Drawing.Size(200, 200);
// specify that image map must be shown at the left-top corner of image viewer
imageMap1.Anchor = Vintasoft.Imaging.UI.AnchorType.Left | Vintasoft.Imaging.UI.AnchorType.Top;
// specify that image map tool border must have red color
imageMap1.CanvasPen = new System.Drawing.Pen(System.Drawing.Color.Red);
// specify that the border of image's visible region in image map must have lime color
imageMap1.VisibleRectPen = new System.Drawing.Pen(System.Drawing.Color.Lime);

// create the second image map tool
Vintasoft.Imaging.UI.VisualTools.ImageMapTool imageMap2 = new Vintasoft.Imaging.UI.VisualTools.ImageMapTool();
// specify that image map must be enabled
imageMap2.Enabled = true;
// specify that image map tool must show image in 1/25 scale from image viewer zoom
imageMap2.Zoom = 1 / 25f;
// specify that image map must have size 200x200 pixels
imageMap1.Size = new System.Drawing.Size(200, 200);
// specify that image map must be shown at the left-bottom corner of image viewer
imageMap2.Anchor = Vintasoft.Imaging.UI.AnchorType.Left | Vintasoft.Imaging.UI.AnchorType.Bottom;
// specify that image map tool border must have red color
imageMap2.CanvasPen = new System.Drawing.Pen(System.Drawing.Color.Red);
// specify that the border of image's visible region in image map must have lime color
imageMap2.VisibleRectPen = new System.Drawing.Pen(System.Drawing.Color.Lime);

// create composite visual tool that combines first and second image map tools
Vintasoft.Imaging.UI.VisualTools.CompositeVisualTool compositeVisualTool = new Vintasoft.Imaging.UI.VisualTools.CompositeVisualTool(imageMap1, imageMap2);

// set composite visual tool as current visual tool of image viewer
imageViewer1.VisualTool = compositeVisualTool;

La capture d'écran ci-dessous montre la visionneuse d'images avec 2 cartes d'image:
Image viewer with 2 image maps in VintaSoft Imaging Demo