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 162 of file SkiaStitch.cs.

163 {
164 _openSlideSource = openSlideSource ?? throw new ArgumentNullException(nameof(openSlideSource));
165 _isOpenSlide = true;
166
167 InitializeCommon(maxCacheSizeMB);
168 }

◆ SkiaStitchingPipeline() [2/2]

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

Initialize pipeline for BioLib slide source.

Definition at line 173 of file SkiaStitch.cs.

174 {
175 _slideSource = slideSource ?? throw new ArgumentNullException(nameof(slideSource));
176 _isOpenSlide = false;
177
178 InitializeCommon(maxCacheSizeMB);
179 }

Member Function Documentation

◆ ClearCache()

void BioGTK.SkiaStitchingPipeline.ClearCache ( )

Clear entire cache.

Definition at line 735 of file SkiaStitch.cs.

736 {
737 lock (_cacheLock)
738 {
739 foreach (var tile in _tileCache.Values)
740 {
741 tile.Image?.Dispose();
742 }
743 _tileCache.Clear();
744 }
745 }

◆ Dispose()

void BioGTK.SkiaStitchingPipeline.Dispose ( )

Definition at line 825 of file SkiaStitch.cs.

826 {
827 ClearCache();
828 _pendingTileFetches.Clear();;
829 }
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 237 of file SkiaStitch.cs.

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

◆ 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 195 of file SkiaStitch.cs.

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

Property Documentation

◆ EnablePrefetch

bool BioGTK.SkiaStitchingPipeline.EnablePrefetch = false
getset

Definition at line 47 of file SkiaStitch.cs.

47{ get; set; } = false;

◆ PrefetchRadius

int BioGTK.SkiaStitchingPipeline.PrefetchRadius = 1
getset

Definition at line 45 of file SkiaStitch.cs.

45{ get; set; } = 1;

◆ Sampling

SKSamplingOptions BioGTK.SkiaStitchingPipeline.Sampling = SKSamplingOptions.Default
getset

Definition at line 46 of file SkiaStitch.cs.

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

◆ TileSize

int BioGTK.SkiaStitchingPipeline.TileSize = 256
getset

Definition at line 44 of file SkiaStitch.cs.

44{ get; set; } = 256;

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