Benchmarks
How fast Egami is next to ImageSharp, SkiaSharp and Magick.NET on the same tasks and inputs. This page has 260 comparisons (each case against each library timed on it). Egami is faster in 234 of them, within 5% in 16, and more than 5% slower in 10, led by lossless WebP at effort 4 on screen content, where SkiaSharp's native libwebp is about 10 times faster. Against ImageSharp, Egami is typically 1.5 to 3 times faster.
Performance has the tips that keep your own code fast and the benchmarks that ship with Egami.
Summary
Each library has its own column with its typical time relative to Egami's on the same task and input (the geometric mean over the cases). Egami is the 1.00× baseline: 2.00× means that library takes twice as long, and below 1.00× it is faster than Egami. An empty cell means that library was not measured for the area. Cases counts the scenarios in the area; a scenario timed against two libraries makes two comparisons. Areas marked Oct 30 were rerun on 30 October 2026 and JPEG encode on 3 November; the rest come from runs between 9 and 22 October.
| Area | Cases | Egami | ImageSharp | SkiaSharp | Magick.NET |
|---|---|---|---|---|---|
| JPEG decode (Oct 30) | 24 | 1.00× | 1.47× | 2.11× | |
| JPEG encode (Nov 3) | 4 | 1.00× | 2.45× | ||
| JPEG probe, EXIF and thumbnail | 6 | 1.00× | 3.03× | ||
| PNG decode (Oct 30) | 6 | 1.00× | 2.27× | 2.09× | |
| PNG probe | 6 | 1.00× | 38.09× | 1.44× | |
| PNG encode (Oct 30) | 8 | 1.00× | 2.48× | 2.74× | |
| WebP lossless decode (Oct 30) | 2 | 1.00× | 3.50× | 1.53× | |
| WebP lossy decode (Oct 30) | 2 | 1.00× | 1.61× | 1.01× | |
| WebP lossy encode, effort 4 (Oct 30) | 2 | 1.00× | 3.48× | 0.99× | |
| WebP lossless encode, effort 0 (Oct 30) | 2 | 1.00× | 7.34× | 1.37× | |
| WebP lossless encode, effort 4 (Oct 30) | 2 | 1.00× | 2.03× | 0.31× | |
| WebP at matched file size (Oct 30) | 4 | 1.00× | 1.62× | ||
| Simple formats decode | 2 | 1.00× | 1.46× | ||
| Simple formats encode (BMP, PNM, QOI, TGA) | 18 | 1.00× | 3.25× | ||
| GIF and APNG | 24 | 1.00× | 2.57× | ||
| Reduced-size decode | 12 | 1.00× | 1.09× | ||
| Operations (resize, blur, rotate, fill and more) | 36 | 1.00× | 3.39× | ||
| Blend modes (DrawImage) | 18 | 1.00× | 1.43× | 3.36× | |
| Compositor blend | 3 | 1.00× | 1.06× | ||
| Scoped operations (rectangle, mask) | 4 | 1.00× | 5.40× | 35.46× | |
| Pixel conversion | 18 | 1.00× | 2.43× | ||
| Color space conversion | 2 | 1.00× | 1.68× | ||
| Channel extract, combine, shuffle | 6 | 1.00× | 5.44× | ||
| Color keying | 10 | 1.00× | 10.82× |
Where Egami is slower
The one large gap left is lossless WebP at effort 4 on screen content, about 10× slower than libwebp; at effort 0 Egami matches libwebp there and writes a smaller file. The rest are within 15% or single cases.
| Case | Egami | ImageSharp | SkiaSharp |
|---|---|---|---|
| WebP lossless encode, effort 4, screenshot, all cores (Oct 30) | 118 ms | 208 ms | 11.9 ms |
| Pixel conversion, Rgba8 to GrayAlpha16 | 8.95 ms | 2.80 ms | |
| Reduced-size decode, TGA 32-bit, all cores | 8.03 ms | 5.91 ms | |
| DrawImage DestinationIn, 1 thread | 615.8 µs | 524.1 µs | 1.22 ms |
| WebP lossless encode, matched size, screenshot, 1 thread (Oct 30) | 14.1 ms | 12.0 ms | |
| Reduced-size decode, TGA 32-bit, 1 thread | 7.60 ms | 6.68 ms | |
| Pixel conversion, Argb8 to Rgba8 | 97.1 µs | 86.2 µs | |
| Reduced-size decode, PNG screenshot, all cores | 7.29 ms | 6.56 ms | |
| WebP lossless encode, effort 4, photo, all cores (Oct 30) | 1,039 ms | 2,437 ms | 964 ms |
| WebP lossy decode, photo, all cores (Oct 30) | 23.7 ms | 40.5 ms | 22.1 ms |
At 1 thread, lossless WebP at effort 4 on the photo is also about 2.3× slower than libwebp (Egami 2,283 ms).
The JPEG quality 90 case is not like for like: Egami writes optimized Huffman tables there, ImageSharp does not.
How it was measured
The numbers come from a comparison harness kept apart from the Egami repository, so that Egami itself never references the other libraries. Most areas were run between 9 and 22 October 2026 against Egami's main branch on that day. JPEG and PNG were rerun on 30 October against Egami cd0e6b41 (decode, after the speed work in #208) and 35d45808 (encode), and JPEG encode again on 3 November against c7adaa2e (after the encode speed work in #244 to #246); WebP was rerun on 30 October against 6b8b07b9. Compare libraries within one run only: absolute times differ a little between runs.
- Machine: AMD Ryzen 9 3900X, 12 cores and 24 threads, Windows 10 22H2, .NET 10.0.12 x64 (AVX2).
- Libraries: ImageSharp 3.1.12, SkiaSharp (native Skia, libpng and libwebp), Magick.NET Q16 (native ImageMagick).
- Job: BenchmarkDotNet ShortRun: 3 warmups and 3 iterations. Error bars are wide on some rows, so treat differences under about 10% as a tie.
- Threads: "1 thread" sets Egami's
MaxParallelismand ImageSharp'sMaxDegreeOfParallelismto 1; "All cores" leaves them at the processor count. SkiaSharp and Magick.NET choose their own threading. - Left out: drawing, text, SVG, barcode and video speed are timed separately and are not on this page.
Full results
Every comparison row, codecs first, then operations. Times are BenchmarkDotNet means; the last columns are the other library's time divided by Egami's.
JPEG decode
Rerun Oct 30 against Egami cd0e6b41, the JPEG and PNG speed work merged as #208. Compare libraries within a run only: absolute times differ between runs for all libraries. Quarter and eighth size use each library's reduced decode; SkiaSharp was timed at full size only.
| Case | File | Threads | Egami | ImageSharp | SkiaSharp | ImageSharp ÷ Egami | SkiaSharp ÷ Egami |
|---|---|---|---|---|---|---|---|
| Full size | 420 | All cores | 33.83 ms | 61.16 ms | 93.74 ms | 1.81× | 2.77× |
| Full size, fast upsampling | 420 | All cores | 31.53 ms | ||||
| Quarter size | 420 | All cores | 40.11 ms | 45.34 ms | 1.13× | ||
| Eighth size | 420 | All cores | 29.47 ms | 37.85 ms | 1.28× | ||
| Full size | 420 | 1 thread | 48.73 ms | 60.86 ms | 93.27 ms | 1.25× | 1.91× |
| Full size, fast upsampling | 420 | 1 thread | 49.72 ms | ||||
| Quarter size | 420 | 1 thread | 39.99 ms | 45.86 ms | 1.15× | ||
| Eighth size | 420 | 1 thread | 30.54 ms | 37.50 ms | 1.23× | ||
| Full size | 444 | All cores | 36.85 ms | 78.44 ms | 106 ms | 2.13× | 2.88× |
| Full size, fast upsampling | 444 | All cores | 38.62 ms | ||||
| Quarter size | 444 | All cores | 47.81 ms | 59.70 ms | 1.25× | ||
| Eighth size | 444 | All cores | 39.80 ms | 42.43 ms | 1.07× | ||
| Full size | 444 | 1 thread | 62.58 ms | 78.11 ms | 107 ms | 1.25× | 1.71× |
| Full size, fast upsampling | 444 | 1 thread | 60.74 ms | ||||
| Quarter size | 444 | 1 thread | 49.65 ms | 61.57 ms | 1.24× | ||
| Eighth size | 444 | 1 thread | 37.87 ms | 42.52 ms | 1.12× | ||
| Full size | gray | All cores | 29.24 ms | 48.04 ms | 73.14 ms | 1.64× | 2.50× |
| Full size, fast upsampling | gray | All cores | 28.09 ms | ||||
| Quarter size | gray | All cores | 32.88 ms | 38.63 ms | 1.17× | ||
| Eighth size | gray | All cores | 27.73 ms | 32.27 ms | 1.16× | ||
| Full size | gray | 1 thread | 36.22 ms | 47.41 ms | 71.50 ms | 1.31× | 1.97× |
| Full size, fast upsampling | gray | 1 thread | 36.11 ms | ||||
| Quarter size | gray | 1 thread | 32.50 ms | 38.27 ms | 1.18× | ||
| Eighth size | gray | 1 thread | 27.34 ms | 33.87 ms | 1.24× | ||
| Full size | progressive | All cores | 67.38 ms | 148 ms | 168 ms | 2.20× | 2.50× |
| Full size, fast upsampling | progressive | All cores | 67.27 ms | ||||
| Quarter size | progressive | All cores | 84.55 ms | 128 ms | 1.52× | ||
| Eighth size | progressive | All cores | 18.32 ms | 127 ms | 6.95× | ||
| Full size | progressive | 1 thread | 136 ms | 147 ms | 168 ms | 1.09× | 1.24× |
| Full size, fast upsampling | progressive | 1 thread | 136 ms | ||||
| Quarter size | progressive | 1 thread | 130 ms | 129 ms | 0.99× | ||
| Eighth size | progressive | 1 thread | 28.43 ms | 119 ms | 4.19× |
JPEG encode
Rerun Nov 3 against Egami main c7adaa2e, after the JPEG encode speed work (#244 to #246). Quality 90 is timed both plain, like ImageSharp, and with Egami's optimized Huffman tables, which ImageSharp does not offer.
| Case | Threads | Egami | ImageSharp | ImageSharp ÷ Egami |
|---|---|---|---|---|
| Quality 75, half chroma | All cores | 15.96 ms | 59.22 ms | 3.71× |
| Quality 90, full chroma | All cores | 38.08 ms | 102 ms | 2.67× |
| Quality 90, full chroma, optimized | All cores | 50.69 ms | ||
| Quality 75, half chroma | 1 thread | 28.22 ms | 57.44 ms | 2.04× |
| Quality 90, full chroma | 1 thread | 56.06 ms | 99.79 ms | 1.78× |
| Quality 90, full chroma, optimized | 1 thread | 81.45 ms |
Against libjpeg-turbo's cjpeg (3.0.3, with its SIMD), egami-compare's 24-megapixel gate encodes on one thread, from a PPM
in memory to a null output for both: Egami takes 0.91 to 1.07 times cjpeg's time at quality 75 4:2:0 and 0.55 to 0.58 times
at quality 90 4:4:4 with optimized tables (cjpeg -optimize). The files are byte for byte cjpeg's.
JPEG probe, EXIF and thumbnail
Run Oct 9.
| Case | Threads | Egami | ImageSharp | ImageSharp ÷ Egami |
|---|---|---|---|---|
| Probe 50 files | All cores | 390.9 µs | 824.3 µs | 2.11× |
| EXIF 50 files | All cores | 497.2 µs | 5.73 ms | 11.52× |
| Thumbnail | All cores | 32.72 ms | 38.71 ms | 1.18× |
| Probe 50 files | 1 thread | 393.9 µs | 832.1 µs | 2.11× |
| EXIF 50 files | 1 thread | 474.7 µs | 5.13 ms | 10.80× |
| Thumbnail | 1 thread | 32.41 ms | 38.53 ms | 1.19× |
PNG decode and probe
Decode rerun Oct 30 against Egami cd0e6b41 (#208); the probe rows are from Oct 18. Egami's probe reads only the header; ImageSharp's reads further into the file.
| Method | Scenario | Egami | ImageSharp | SkiaSharp | ImageSharp ÷ Egami | SkiaSharp ÷ Egami |
|---|---|---|---|---|---|---|
| Decode | Adam7-RGBA8 | 29.15 ms | 41.88 ms | 58.24 ms | 1.44× | 2.00× |
| Decode | Gray1 | 5.45 ms | 23.74 ms | 20.64 ms | 4.36× | 3.79× |
| Decode | Palette8 | 1.26 ms | 8.15 ms | 2.51 ms | 6.48× | 1.99× |
| Decode | Photo-RGBA8 | 71.18 ms | 102 ms | 103 ms | 1.43× | 1.45× |
| Decode | RGB16 | 49.91 ms | 74.05 ms | 61.60 ms | 1.48× | 1.23× |
| Decode | Screenshot-RGB8 | 1.09 ms | 1.75 ms | 3.33 ms | 1.61× | 3.06× |
| Probe (Oct 18) | Adam7-RGBA8 | 2.0 µs | 483.7 µs | 2.3 µs | 241.53× | 1.13× |
| Probe (Oct 18) | Gray1 | 880 ns | 2.9 µs | 2.1 µs | 3.33× | 2.36× |
| Probe (Oct 18) | Palette8 | 2.1 µs | 4.0 µs | 2.3 µs | 1.94× | 1.11× |
| Probe (Oct 18) | Photo-RGBA8 | 1.8 µs | 1.67 ms | 1.7 µs | 939.16× | 0.95× |
| Probe (Oct 18) | RGB16 | 1.6 µs | 793.2 µs | 1.7 µs | 497.18× | 1.08× |
| Probe (Oct 18) | Screenshot-RGB8 | 1.0 µs | 4.4 µs | 3.0 µs | 4.19× | 2.89× |
PNG encode
Rerun Oct 30 against Egami main 35d45808.
| Scenario | Level | Egami | ImageSharp | SkiaSharp | ImageSharp ÷ Egami | SkiaSharp ÷ Egami |
|---|---|---|---|---|---|---|
| Photo-RGBA8 | 1 | 305 ms | 905 ms | 900 ms | 2.97× | 2.95× |
| Photo-RGBA8 | 5 | 1,118 ms | 1,898 ms | 1,670 ms | 1.70× | 1.49× |
| Photo-RGBA8 | 6 | 2,213 ms | 4,694 ms | 3,679 ms | 2.12× | 1.66× |
| Photo-RGBA8 | 9 | 3,057 ms | 14,567 ms | 7,481 ms | 4.76× | 2.45× |
| Screenshot-RGB8 | 1 | 18.25 ms | 33.55 ms | 67.46 ms | 1.84× | 3.70× |
| Screenshot-RGB8 | 5 | 16.31 ms | 49.85 ms | 84.68 ms | 3.06× | 5.19× |
| Screenshot-RGB8 | 6 | 16.75 ms | 52.64 ms | 94.48 ms | 3.14× | 5.64× |
| Screenshot-RGB8 | 9 | 79.55 ms | 127 ms | 129 ms | 1.59× | 1.62× |
WebP lossy decode
Rerun Oct 30 against Egami main 6b8b07b9 (ShortRun). All cores; 1 thread was within a few percent.
| Picture | Egami | ImageSharp | SkiaSharp | ImageSharp ÷ Egami | SkiaSharp ÷ Egami |
|---|---|---|---|---|---|
| photo | 23.7 ms | 40.5 ms | 22.1 ms | 1.71× | 0.93× |
| screenshot | 24.2 ms | 36.6 ms | 26.5 ms | 1.51× | 1.10× |
WebP lossy encode
Rerun Oct 30 against Egami main 6b8b07b9. Quality 75, effort 4, all cores; 1 thread was within a few percent. SkiaSharp runs native libwebp.
| Picture | Egami | ImageSharp | SkiaSharp | ImageSharp ÷ Egami | SkiaSharp ÷ Egami |
|---|---|---|---|---|---|
| photo | 248 ms | 884 ms | 241 ms | 3.56× | 0.97× |
| screenshot | 167 ms | 567 ms | 169 ms | 3.40× | 1.01× |
WebP lossless encode
Rerun Oct 30 against Egami main 6b8b07b9, all cores. SkiaSharp runs libwebp at its own default, so its time is the same in both effort rows; Egami's effort sets how hard it searches. At 1 thread Egami takes 671 ms (effort 0) and 2,283 ms (effort 4) on the photo and 127 ms on the screenshot at effort 4.
| Picture | Egami effort | Egami | ImageSharp | SkiaSharp | ImageSharp ÷ Egami | SkiaSharp ÷ Egami |
|---|---|---|---|---|---|---|
| photo | 0 | 537 ms | 1,612 ms | 961 ms | 3.00× | 1.79× |
| screenshot | 0 | 11.3 ms | 203 ms | 11.8 ms | 17.96× | 1.04× |
| photo | 4 | 1,039 ms | 2,437 ms | 964 ms | 2.35× | 0.93× |
| screenshot | 4 | 118 ms | 208 ms | 11.9 ms | 1.76× | 0.10× |
WebP lossless decode
Run Oct 30 against Egami main 6b8b07b9, all cores.
| Picture | Egami | ImageSharp | SkiaSharp | ImageSharp ÷ Egami | SkiaSharp ÷ Egami |
|---|---|---|---|---|---|
| photo | 38.4 ms | 95.6 ms | 45.5 ms | 2.49× | 1.18× |
| screenshot | 1.71 ms | 8.40 ms | 3.37 ms | 4.91× | 1.97× |
WebP at matched file size
Run Oct 30, 1 thread. SkiaSharp (libwebp at its defaults) against Egami at the lowest effort whose file is no larger than libwebp's. ImageSharp is not in this suite.
| Case | Egami effort | Egami size | SkiaSharp size | Egami | SkiaSharp | SkiaSharp ÷ Egami |
|---|---|---|---|---|---|---|
| photo, lossless | 0 | 2,474,194 bytes | 2,931,846 bytes | 683 ms | 1,154 ms | 1.69× |
| photo, lossy q75 | 0 | 134,692 bytes | 192,232 bytes | 48.9 ms | 245 ms | 5.01× |
| screenshot, lossless | 0 | 2,564 bytes | 3,522 bytes | 14.1 ms | 12.0 ms | 0.85× |
| screenshot, lossy q75 | 4 | 366,354 bytes | 374,590 bytes | 171.5 ms | 169.0 ms | 0.99× |
Simple formats decode
Run Oct 9.
| Threads | Egami | ImageSharp | ImageSharp ÷ Egami |
|---|---|---|---|
| All cores | 709.5 µs | 1.03 ms | 1.45× |
| 1 thread | 688.3 µs | 1.02 ms | 1.48× |
Simple formats encode (BMP, PNM, QOI, TGA)
Run Oct 9. Times were the same at 1 thread and all cores, so all cores is shown.
| Case | Egami | ImageSharp | ImageSharp ÷ Egami |
|---|---|---|---|
| BMP 24-bit | 464.6 µs | 730.3 µs | 1.57× |
| BMP 32-bit | 180.7 µs | 937.7 µs | 5.19× |
| TGA 32-bit RLE | 3.62 ms | 109 ms | 29.99× |
| TGA 32-bit raw | 293.7 µs | 954.9 µs | 3.25× |
| QOI photo | 14.42 ms | 63.58 ms | 4.41× |
| QOI screenshot | 3.05 ms | 14.04 ms | 4.61× |
| PNM P6 | 196.2 µs | 369.3 µs | 1.88× |
| PNM P5 wide | 184.8 µs | 221.4 µs | 1.20× |
| PNM P3 | 4.03 ms | 4.32 ms | 1.07× |
GIF and APNG
Run Oct 18.
| Case | Threads | Egami | ImageSharp | ImageSharp ÷ Egami |
|---|---|---|---|---|
| GIF decode, animated | All cores | 38.85 ms | 54.56 ms | 1.40× |
| GIF decode, animated | 1 thread | 38.22 ms | 54.72 ms | 1.43× |
| GIF decode, still | All cores | 12.34 ms | 17.36 ms | 1.41× |
| GIF decode, still | 1 thread | 12.58 ms | 17.37 ms | 1.38× |
| GIF decode, first frame | All cores | 734.6 µs | 1.16 ms | 1.57× |
| GIF decode, first frame | 1 thread | 748.6 µs | 1.17 ms | 1.57× |
| GIF encode, photo dithered | All cores | 98.17 ms | 212 ms | 2.16× |
| GIF encode, photo dithered | 1 thread | 81.64 ms | 203 ms | 2.49× |
| GIF encode, photo undithered | All cores | 46.91 ms | 91.07 ms | 1.94× |
| GIF encode, photo undithered | 1 thread | 44.30 ms | 78.00 ms | 1.76× |
| GIF encode, exact colors | All cores | 54.79 ms | 97.90 ms | 1.79× |
| GIF encode, exact colors | 1 thread | 43.99 ms | 88.56 ms | 2.01× |
| GIF encode, animated, global palette | All cores | 193 ms | 342 ms | 1.77× |
| GIF encode, animated, global palette | 1 thread | 253 ms | 343 ms | 1.36× |
| GIF encode, animated, palette per frame | All cores | 128 ms | 2,898 ms | 22.73× |
| GIF encode, animated, palette per frame | 1 thread | 370 ms | 2,888 ms | 7.81× |
| APNG decode | All cores | 27.28 ms | 50.23 ms | 1.84× |
| APNG decode | 1 thread | 26.11 ms | 48.86 ms | 1.87× |
| APNG encode | All cores | 172 ms | 385 ms | 2.25× |
| APNG encode | 1 thread | 157 ms | 298 ms | 1.90× |
| Animated thumbnail | All cores | 92.64 ms | 185 ms | 2.00× |
| Animated thumbnail | 1 thread | 176 ms | 195 ms | 1.11× |
| Probe | All cores | 162.3 µs | 4.40 ms | 27.11× |
| Probe | 1 thread | 159.0 µs | 4.37 ms | 27.46× |
Reduced-size decode
Run Oct 11.
| Scenario | Threads | Egami | ImageSharp | ImageSharp ÷ Egami |
|---|---|---|---|---|
| bmp-24 | All cores | 5.67 ms | 5.38 ms | 0.95× |
| bmp-24 | 1 thread | 5.49 ms | 5.55 ms | 1.01× |
| jpeg-photo | All cores | 41.87 ms | 47.98 ms | 1.15× |
| jpeg-photo | 1 thread | 43.61 ms | 55.08 ms | 1.26× |
| png-photo | All cores | 126 ms | 178 ms | 1.41× |
| png-photo | 1 thread | 126 ms | 138 ms | 1.09× |
| png-screenshot | All cores | 7.29 ms | 6.56 ms | 0.90× |
| png-screenshot | 1 thread | 7.30 ms | 7.38 ms | 1.01× |
| qoi-rgb | All cores | 21.47 ms | 32.41 ms | 1.51× |
| qoi-rgb | 1 thread | 21.13 ms | 31.65 ms | 1.50× |
| tga-32 | All cores | 8.03 ms | 5.91 ms | 0.74× |
| tga-32 | 1 thread | 7.60 ms | 6.68 ms | 0.88× |
Operations (resize, blur, rotate, fill and more)
Run Oct 18.
| Scenario | Threads | Egami | ImageSharp | ImageSharp ÷ Egami |
|---|---|---|---|---|
| Blur, radius 25 | All cores | 48.10 ms | 79.65 ms | 1.66× |
| Blur, radius 25 | 1 thread | 119 ms | 1,183 ms | 9.97× |
| Blur, radius 3 | All cores | 2.48 ms | 9.78 ms | 3.94× |
| Blur, radius 3 | 1 thread | 19.44 ms | 280 ms | 14.42× |
| Color chain | All cores | 4.44 ms | 8.84 ms | 1.99× |
| Color chain | 1 thread | 34.99 ms | 80.51 ms | 2.30× |
| DrawImage | All cores | 106.4 µs | 305.3 µs | 2.87× |
| DrawImage | 1 thread | 362.9 µs | 571.2 µs | 1.57× |
| Fill | All cores | 5.11 ms | 20.01 ms | 3.92× |
| Fill | 1 thread | 15.92 ms | 20.77 ms | 1.30× |
| Flip horizontal | All cores | 2.06 ms | 2.57 ms | 1.25× |
| Flip horizontal | 1 thread | 4.43 ms | 4.41 ms | 1.00× |
| Resize, bicubic | All cores | 3.22 ms | 31.80 ms | 9.86× |
| Resize, bicubic | 1 thread | 23.21 ms | 30.76 ms | 1.33× |
| Resize, bilinear | All cores | 2.75 ms | 24.16 ms | 8.79× |
| Resize, bilinear | 1 thread | 15.43 ms | 23.45 ms | 1.52× |
| Resize, box | All cores | 2.00 ms | 21.44 ms | 10.73× |
| Resize, box | 1 thread | 12.39 ms | 20.02 ms | 1.62× |
| Resize, Lanczos3 | All cores | 4.81 ms | 38.51 ms | 8.01× |
| Resize, Lanczos3 | 1 thread | 33.38 ms | 40.60 ms | 1.22× |
| Resize, linear light | All cores | 7.59 ms | 96.50 ms | 12.72× |
| Resize, linear light | 1 thread | 67.99 ms | 89.25 ms | 1.31× |
| Resize, Mitchell | All cores | 3.64 ms | 33.80 ms | 9.29× |
| Resize, Mitchell | 1 thread | 23.99 ms | 32.71 ms | 1.36× |
| Resize, nearest | All cores | 116.1 µs | 293.5 µs | 2.53× |
| Resize, nearest | 1 thread | 446.2 µs | 810.3 µs | 1.82× |
| Rotate 15° | All cores | 4.85 ms | 82.14 ms | 16.92× |
| Rotate 15° | 1 thread | 47.15 ms | 1,053 ms | 22.33× |
| Rotate 90° | All cores | 9.18 ms | 20.23 ms | 2.20× |
| Rotate 90° | 1 thread | 17.64 ms | 153 ms | 8.68× |
| Sharpen | All cores | 1.87 ms | 5.01 ms | 2.68× |
| Sharpen | 1 thread | 14.52 ms | 96.69 ms | 6.66× |
| Thumbnail | All cores | 115 ms | 142 ms | 1.24× |
| Thumbnail | 1 thread | 116 ms | 143 ms | 1.23× |
| Upscale | All cores | 2.46 ms | 26.98 ms | 10.96× |
| Upscale | 1 thread | 16.45 ms | 26.32 ms | 1.60× |
ImageSharp's resize times barely change between 1 thread and all cores in this run, so most of the all-cores resize gap (8 to 13×) comes from Egami's parallel resize.
Blend modes (DrawImage)
Run Oct 11. ImageSharp has no ColorDodge, SoftLight, Hue or Luminosity mode.
| Threads | Mode | Egami | ImageSharp | SkiaSharp | ImageSharp ÷ Egami | SkiaSharp ÷ Egami |
|---|---|---|---|---|---|---|
| All cores | SourceOver | 240.9 µs | 302.0 µs | 1.25 ms | 1.25× | 5.17× |
| All cores | DestinationIn | 178.1 µs | 274.1 µs | 1.29 ms | 1.54× | 7.27× |
| All cores | Multiply | 149.7 µs | 284.0 µs | 1.40 ms | 1.90× | 9.35× |
| All cores | Screen | 154.0 µs | 278.3 µs | 1.38 ms | 1.81× | 8.99× |
| All cores | Overlay | 165.8 µs | 361.3 µs | 1.52 ms | 2.18× | 9.19× |
| All cores | ColorDodge | 1.04 ms | 2.38 ms | 2.30× | ||
| All cores | SoftLight | 400.8 µs | 3.15 ms | 7.86× | ||
| All cores | Hue | 736.5 µs | 3.74 ms | 5.08× | ||
| All cores | Luminosity | 580.2 µs | 3.39 ms | 5.85× | ||
| 1 thread | SourceOver | 350.0 µs | 612.0 µs | 1.03 ms | 1.75× | 2.93× |
| 1 thread | DestinationIn | 615.8 µs | 524.1 µs | 1.22 ms | 0.85× | 1.97× |
| 1 thread | Multiply | 580.9 µs | 638.4 µs | 1.05 ms | 1.10× | 1.80× |
| 1 thread | Screen | 576.0 µs | 678.2 µs | 1.15 ms | 1.18× | 1.99× |
| 1 thread | Overlay | 585.3 µs | 764.0 µs | 1.39 ms | 1.31× | 2.38× |
| 1 thread | ColorDodge | 2.98 ms | 2.99 ms | 1.00× | ||
| 1 thread | SoftLight | 2.00 ms | 3.70 ms | 1.84× | ||
| 1 thread | Hue | 2.79 ms | 4.19 ms | 1.50× | ||
| 1 thread | Luminosity | 2.65 ms | 3.61 ms | 1.36× |
Compositor blend
Run Oct 11.
| Mode | Egami | ImageSharp | ImageSharp ÷ Egami |
|---|---|---|---|
| SourceOver | 8.56 ms | 8.79 ms | 1.03× |
| Multiply | 8.57 ms | 8.78 ms | 1.02× |
| Screen | 7.89 ms | 8.97 ms | 1.14× |
Scoped operations (rectangle, mask)
Run Oct 11. Egami (whole image) is Egami's plain run over the full image, for reference. Rectangle blur is compared with ImageSharp, the mask with Magick.NET's write mask.
| Scenario | Threads | Egami | Egami (whole image) | ImageSharp | Magick.NET | Other ÷ Egami |
|---|---|---|---|---|---|---|
| Blur inside a rectangle | All cores | 2.70 ms | 19.52 ms | 7.35 ms | 2.72× | |
| Blur inside a rectangle | 1 thread | 13.20 ms | 123 ms | 142 ms | 10.72× | |
| Color change inside a mask | All cores | 15.48 ms | 8.97 ms | 1,420 ms | 91.71× | |
| Color change inside a mask | 1 thread | 94.28 ms | 57.92 ms | 1,293 ms | 13.71× |
Pixel conversion
Run Oct 10. Converting one image to and from Rgba8 (ImageSharp's Rgba32).
| Pixel type | Direction | Egami | ImageSharp | ImageSharp ÷ Egami |
|---|---|---|---|---|
| Abgr8 | From Rgba8 | 90.6 µs | 96.2 µs | 1.06× |
| Abgr8 | To Rgba8 | 89.8 µs | 86.0 µs | 0.96× |
| Alpha8 | From Rgba8 | 471.1 µs | 1.66 ms | 3.53× |
| Alpha8 | To Rgba8 | 795.1 µs | 6.36 ms | 8.00× |
| Argb8 | From Rgba8 | 89.2 µs | 87.9 µs | 0.99× |
| Argb8 | To Rgba8 | 97.1 µs | 86.2 µs | 0.89× |
| Bgr565 | From Rgba8 | 429.3 µs | 6.46 ms | 15.05× |
| Bgr565 | To Rgba8 | 414.0 µs | 7.28 ms | 17.58× |
| Bgra4444 | From Rgba8 | 4.54 ms | 7.02 ms | 1.55× |
| Bgra4444 | To Rgba8 | 2.08 ms | 7.34 ms | 3.53× |
| GrayAlpha16 | From Rgba8 | 8.95 ms | 2.80 ms | 0.31× |
| GrayAlpha16 | To Rgba8 | 1.65 ms | 1.59 ms | 0.97× |
| Rgb10A2 | From Rgba8 | 4.52 ms | 6.84 ms | 1.51× |
| Rgb10A2 | To Rgba8 | 4.52 ms | 9.71 ms | 2.15× |
| Rgb16 | From Rgba8 | 323.4 µs | 1.34 ms | 4.15× |
| Rgb16 | To Rgba8 | 819.6 µs | 1.83 ms | 2.23× |
| RgbaF16 | From Rgba8 | 1.96 ms | 9.93 ms | 5.07× |
| RgbaF16 | To Rgba8 | 2.85 ms | 14.58 ms | 5.11× |
Color space conversion
Run Oct 10.
| Case | Egami | SkiaSharp | SkiaSharp ÷ Egami |
|---|---|---|---|
| Display P3 to sRGB | 142 ms | 255 ms | 1.79× |
| Adobe RGB to sRGB | 141 ms | 223 ms | 1.58× |
Channel extract, combine, shuffle
Run Oct 11.
| Scenario | Threads | Egami | Magick.NET | Magick.NET ÷ Egami |
|---|---|---|---|---|
| Combine | All cores | 129 ms | 177 ms | 1.37× |
| Combine | 1 thread | 117 ms | 204 ms | 1.75× |
| Extract | All cores | 79.08 ms | 156 ms | 1.98× |
| Extract | 1 thread | 77.61 ms | 161 ms | 2.07× |
| Shuffle | All cores | 3.34 ms | 550 ms | 164.63× |
| Shuffle | 1 thread | 34.36 ms | 548 ms | 15.95× |
Color keying
Run Oct 11.
| Scenario | Threads | Egami | Magick.NET | Magick.NET ÷ Egami |
|---|---|---|---|---|
| Flood fill | All cores | 232 ms | 250 ms | 1.08× |
| Flood fill | 1 thread | 224 ms | 252 ms | 1.12× |
| Replace color | All cores | 6.70 ms | 378 ms | 56.40× |
| Replace color | 1 thread | 54.39 ms | 388 ms | 7.14× |
| Stack mean | All cores | 13.72 ms | 482 ms | 35.13× |
| Stack mean | 1 thread | 131 ms | 438 ms | 3.34× |
| Stack median | All cores | 28.45 ms | 2,537 ms | 89.19× |
| Stack median | 1 thread | 259 ms | 2,506 ms | 9.68× |
| Make color transparent | All cores | 6.75 ms | 409 ms | 60.61× |
| Make color transparent | 1 thread | 56.23 ms | 412 ms | 7.33× |