BioGTK  6.5.0
A .NET library & program for annotating, editing various microscopy imaging formats using Bioformats supported images. Including whole slide, pyramidal, and series.
Loading...
Searching...
No Matches
BioGTK.SkiaStitchingPipeline Class Reference

SkiaSharp-based tile stitching pipeline for compositing large pyramidal images. More...

Inheritance diagram for BioGTK.SkiaStitchingPipeline:

Classes

class  TileRequest
 Tile request information. More...
 

Public Member Functions

 SkiaStitchingPipeline (OpenSlideGTK.OpenSlideBase openSlideSource, int maxCacheSizeMB=512)
 Initialize pipeline for OpenSlide source.
 
 SkiaStitchingPipeline (SlideBase slideSource, int maxCacheSizeMB=512)
 Initialize pipeline for BioLib slide source.
 
async Task< SKImage > StitchViewportAsync (PointD origin, double resolution, ZCT coordinate, int viewportWidth=600, int viewportHeight=400)
 Stitch tiles for a given viewport asynchronously.
 
SKImage StitchRegion (RectangleD region, int level, ZCT coordinate, double resolution, int pxwidth, int pxheight)
 Stitch a specific region synchronously (for smaller areas)
 
void ClearCache ()
 Clear entire cache.
 
void Dispose ()
 

Properties

int TileSize = 256 [get, set]
 
int PrefetchRadius = 1 [get, set]
 
SKSamplingOptions Sampling = SKSamplingOptions.Default [get, set]
 
bool EnablePrefetch = false [get, set]
 

Detailed Description

SkiaSharp-based tile stitching pipeline for compositing large pyramidal images.

Definition at line 20 of file SkiaStitch.cs.

Constructor & Destructor Documentation

◆ SkiaStitchingPipeline() [1/2]

BioGTK.SkiaStitchingPipeline.SkiaStitchingPipeline ( OpenSlideGTK.OpenSlideBase openSlideSource,
int maxCacheSizeMB = 512 )

Initialize pipeline for OpenSlide source.

Definition at line 156 of file SkiaStitch.cs.

157 {
158 _openSlideSource = openSlideSource ?? throw new ArgumentNullException(nameof(openSlideSource));
159 _isOpenSlide = true;
160
161 InitializeCommon(maxCacheSizeMB);
162 }

◆ SkiaStitchingPipeline() [2/2]

BioGTK.SkiaStitchingPipeline.SkiaStitchingPipeline ( SlideBase slideSource,
int maxCacheSizeMB = 512 )

Initialize pipeline for BioLib slide source.

Definition at line 167 of file SkiaStitch.cs.

168 {
169 _slideSource = slideSource ?? throw new ArgumentNullException(nameof(slideSource));
170 _isOpenSlide = false;
171
172 InitializeCommon(maxCacheSizeMB);
173 }

Member Function Documentation

◆ ClearCache()

void BioGTK.SkiaStitchingPipeline.ClearCache ( )

Clear entire cache.

Definition at line 648 of file SkiaStitch.cs.

649 {
650 lock (_cacheLock)
651 {
652 foreach (var tile in _tileCache.Values)
653 {
654 tile.Image?.Dispose();
655 }
656 _tileCache.Clear();
657 }
658 }

◆ Dispose()

void BioGTK.SkiaStitchingPipeline.Dispose ( )

Definition at line 738 of file SkiaStitch.cs.

739 {
740 ClearCache();
741 _pendingTileFetches.Clear();;
742 }
void ClearCache()
Clear entire cache.

◆ StitchRegion()

SKImage BioGTK.SkiaStitchingPipeline.StitchRegion ( RectangleD region,
int level,
ZCT coordinate,
double resolution,
int pxwidth,
int pxheight )

Stitch a specific region synchronously (for smaller areas)

Definition at line 231 of file SkiaStitch.cs.

235 {
236 var tileRequests = CalculateTileRequests(
237 new PointD(region.X,region.Y),pxwidth, pxheight, level, coordinate, resolution);
238
239 int outputWidth = (int)Math.Ceiling(region.W);
240 int outputHeight = (int)Math.Ceiling(region.H);
241
242 using (var surface = SKSurface.Create(new SKImageInfo(outputWidth, outputHeight)))
243 {
244 var canvas = surface.Canvas;
245 canvas.Clear(SKColors.Transparent);
246
247 foreach (var request in tileRequests)
248 {
249 var tileImage = FetchTileSync(request);
250 if (tileImage != null)
251 {
252 DrawTileToCanvas(canvas,request, new AForge.PointD(region.X,region.Y), resolution, tileImage);
253 }
254 }
255
256 return surface.Snapshot();
257 }
258 }

◆ StitchViewportAsync()

async Task< SKImage > BioGTK.SkiaStitchingPipeline.StitchViewportAsync ( PointD origin,
double resolution,
ZCT coordinate,
int viewportWidth = 600,
int viewportHeight = 400 )

Stitch tiles for a given viewport asynchronously.

Definition at line 189 of file SkiaStitch.cs.

195 {
196 // Calculate viewport parameters
197 int level = CalculateLevelFromResolution(resolution);
198 var tileRequests = CalculateTileRequests(origin, viewportWidth, viewportHeight, level, coordinate, resolution);
199 if (viewportWidth <= 1 || viewportHeight <= 1)
200 {
201 viewportWidth = 600;
202 viewportHeight = 400;
203 }
204 // Create a NEW surface for this render - no shared state, fully parallel-safe
205 using (var surface = SKSurface.Create(new SKImageInfo(
206 viewportWidth,
207 viewportHeight,
208 SKColorType.Rgba8888,
209 SKAlphaType.Premul)))
210 {
211 if (surface == null)
212 {
213 Console.WriteLine("Failed to create SKSurface");
214 return null;
215 }
216
217 var canvas = surface.Canvas;
218 canvas.Clear(SKColors.Gray);
219
220 // Fetch and composite all tiles
221 await CompositeTilesAsync(canvas, tileRequests, origin, resolution);
222
223 // Create and return snapshot
224 return surface.Snapshot();
225 } // Surface automatically disposed here
226 }

Property Documentation

◆ EnablePrefetch

bool BioGTK.SkiaStitchingPipeline.EnablePrefetch = false
getset

Definition at line 46 of file SkiaStitch.cs.

46{ get; set; } = false;

◆ PrefetchRadius

int BioGTK.SkiaStitchingPipeline.PrefetchRadius = 1
getset

Definition at line 44 of file SkiaStitch.cs.

44{ get; set; } = 1;

◆ Sampling

SKSamplingOptions BioGTK.SkiaStitchingPipeline.Sampling = SKSamplingOptions.Default
getset

Definition at line 45 of file SkiaStitch.cs.

45{ get; set; } = SKSamplingOptions.Default;

◆ TileSize

int BioGTK.SkiaStitchingPipeline.TileSize = 256
getset

Definition at line 43 of file SkiaStitch.cs.

43{ get; set; } = 256;

The documentation for this class was generated from the following file: