DotNetBrightener.UploadService.ImageOptimizer 2026.0.1-preview-notification-service-696

This is a prerelease version of DotNetBrightener.UploadService.ImageOptimizer.
There is a newer prerelease version of this package available.
See the version list below for details.
dotnet add package DotNetBrightener.UploadService.ImageOptimizer --version 2026.0.1-preview-notification-service-696
                    
NuGet\Install-Package DotNetBrightener.UploadService.ImageOptimizer -Version 2026.0.1-preview-notification-service-696
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="DotNetBrightener.UploadService.ImageOptimizer" Version="2026.0.1-preview-notification-service-696" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="DotNetBrightener.UploadService.ImageOptimizer" Version="2026.0.1-preview-notification-service-696" />
                    
Directory.Packages.props
<PackageReference Include="DotNetBrightener.UploadService.ImageOptimizer" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add DotNetBrightener.UploadService.ImageOptimizer --version 2026.0.1-preview-notification-service-696
                    
#r "nuget: DotNetBrightener.UploadService.ImageOptimizer, 2026.0.1-preview-notification-service-696"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package DotNetBrightener.UploadService.ImageOptimizer@2026.0.1-preview-notification-service-696
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=DotNetBrightener.UploadService.ImageOptimizer&version=2026.0.1-preview-notification-service-696&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=DotNetBrightener.UploadService.ImageOptimizer&version=2026.0.1-preview-notification-service-696&prerelease
                    
Install as a Cake Tool

DotNetBrightener.UploadService.ImageOptimizer

Image optimization and resizing functionality for DotNetBrightener Upload Service.

๐Ÿ”’ Migration Notice - Version 2026.0.1+

Version 2026.0.1+ has migrated from Magick.NET to SkiaSharp due to security vulnerability CVE-2025-65955.

Security Details

  • Vulnerability: CVE-2025-65955 (CVSS 4.9/10 - Moderate)
  • Affected Package: Magick.NET v14.9.1
  • Issue: Use-after-free/double-free in ImageMagick's Magick++ layer
  • Resolution: Migrated to SkiaSharp (Microsoft-backed, actively maintained)

๐Ÿš€ Breaking Changes

Old Method (Deprecated)

services.AddUploadService(config)
    .UseImageMagickOptimizer(); // โš ๏ธ Deprecated - shows warning
services.AddUploadService(config)
    .UseSkiaSharpOptimizer(); // โœ… Use this instead

โœจ Benefits of SkiaSharp

  • โœ… No security vulnerabilities - Actively maintained by Microsoft
  • โœ… Better cross-platform support - Windows, Linux, macOS, iOS, Android
  • โœ… High performance - Native Skia graphics engine
  • โœ… Modern .NET API - Designed for .NET Core and beyond
  • โœ… Comprehensive graphics features - More than just image resizing

๐Ÿ“ฆ Installation

dotnet add package DotNetBrightener.UploadService.ImageOptimizer

๐Ÿ“– Usage

Basic Setup

using Microsoft.Extensions.DependencyInjection;

// In your Startup.cs or Program.cs
services.AddUploadService(configuration)
    .UseSkiaSharpOptimizer();

Advanced Configuration

services.AddUploadService(configuration)
    .UseSkiaSharpOptimizer()
    .ConfigureUploadOptions(options =>
    {
        options.MaxFileSize = 10 * 1024 * 1024; // 10MB
        options.AllowedFileExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif", ".webp" };
    });

๐Ÿ”„ Migration Guide

Step 1: Update Package Reference

No changes needed if using centralized package management. The package will automatically use SkiaSharp.

Step 2: Update Code

Before:

services.AddUploadService(config)
    .UseImageMagickOptimizer();

After:

services.AddUploadService(config)
    .UseSkiaSharpOptimizer();

Step 3: Test Your Application

  1. Build your application
  2. Run unit tests
  3. Test image upload and resize functionality
  4. Verify image quality meets your requirements

Backward Compatibility

The old UseImageMagickOptimizer() method still works but:

  • Shows an [Obsolete] warning during compilation
  • Internally redirects to UseSkiaSharpOptimizer()
  • Will be removed in the next major version

๐Ÿ“ Supported Image Formats

SkiaSharp supports the following image formats:

  • PNG (default output format)
  • JPEG / JPG
  • GIF (including animated)
  • WebP
  • BMP
  • ICO
  • WBMP

๐Ÿ› ๏ธ API Reference

SkiaSharpImageOptimizer

public class SkiaSharpImageOptimizer : IImageResizer
{
    /// <summary>
    /// Resizes an image from the input stream to the specified dimensions
    /// </summary>
    /// <param name="inputStream">The input image stream</param>
    /// <param name="newWidth">The target width (absolute value will be used)</param>
    /// <param name="newHeight">The target height (absolute value will be used)</param>
    /// <returns>A new stream containing the resized image in PNG format</returns>
    Stream ResizeImageFromStream(Stream inputStream, int newWidth, int newHeight);
}

Extension Methods

// Recommended method
public static UploadServiceConfigurationBuilder UseSkiaSharpOptimizer(
    this UploadServiceConfigurationBuilder builder);

// Deprecated method (backward compatibility)
[Obsolete("Use UseSkiaSharpOptimizer instead")]
public static UploadServiceConfigurationBuilder UseImageMagickOptimizer(
    this UploadServiceConfigurationBuilder builder);

๐Ÿงช Testing

The package includes comprehensive unit tests:

  • Valid image resizing
  • Negative dimension handling (converts to absolute values)
  • Invalid stream handling
  • Various dimension scenarios
  • Large image handling
  • Output format verification (PNG)

To run tests:

cd src/UploadService/DotNetBrightener.UploadService.ImageOptimizer.Tests
dotnet test

๐Ÿ“Š Performance

SkiaSharp provides excellent performance characteristics:

  • High-quality resizing with SKFilterQuality.High
  • Native code execution via Skia engine
  • Efficient memory usage with proper disposal patterns
  • Cross-platform optimization for each OS

๐Ÿ› Troubleshooting

"Failed to decode image from input stream"

Cause: The input stream doesn't contain a valid image or format is not supported.

Solution: Verify the input stream contains valid image data and is in a supported format.

"Failed to resize image"

Cause: Invalid target dimensions or corrupted source image.

Solution: Ensure width and height are positive integers and source image is valid.


๐Ÿ”— Dependencies

  • SkiaSharp (3.119.1 or later) - Main graphics library
  • Microsoft.AspNetCore.App - Framework reference
  • DotNetBrightener.SimpleUploadService - Upload service abstractions

๐Ÿ“œ License

This package is part of the DotNetBrightener Framework.

ยฉ 2017 - 2025 Vampire Coder (formerly DotNet Brightener)


๐Ÿ†˜ Support

For issues, questions, or contributions:


๐Ÿ“š Additional Resources

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2026.0.1-preview-notificati... 0 12/7/2025
2026.0.1-preview-notificati... 26 12/6/2025
2026.0.1-preview-net10-upgr... 164 11/25/2025
2026.0.1-preview-net10-upgr... 163 11/25/2025
2026.0.1-preview-net10-upgr... 160 11/25/2025
2026.0.1-preview-net10-upgr... 157 11/24/2025
2026.0.1-preview-net10-upgr... 168 11/24/2025
2026.0.1-preview-migrate-to... 40 12/6/2025
2026.0.1-preview-700 0 12/7/2025
2026.0.1-preview-689 35 12/6/2025
2026.0.1-preview-676 621 12/2/2025
2026.0.1-preview-671 94 11/29/2025
2026.0.1-preview-670 94 11/29/2025
2026.0.1-preview-669 93 11/29/2025
2026.0.1-preview-667 172 11/27/2025
2026.0.1-preview-665 158 11/27/2025
2026.0.1-preview-664 159 11/27/2025
2026.0.1-preview-660 162 11/25/2025
2025.0.10 167 11/25/2025
2025.0.10-preview-628 376 11/20/2025
2025.0.10-preview-605 259 11/17/2025
2025.0.10-preview-602 262 11/17/2025
2025.0.10-preview-581 254 11/11/2025
2025.0.10-preview-559 178 10/29/2025
2025.0.10-preview-557 166 10/27/2025
2025.0.9 165 10/26/2025
2025.0.9-preview-553 154 10/26/2025
2025.0.9-preview-539 97 10/12/2025
2025.0.9-preview-535 166 10/8/2025
2025.0.9-preview-509 150 10/2/2025
2025.0.9-preview-508 157 10/2/2025
2025.0.9-preview-487 156 9/29/2025
2025.0.9-preview-481 159 9/29/2025
2025.0.9-preview-473 140 9/28/2025
2025.0.8 159 9/23/2025
2025.0.6 172 9/22/2025
2025.0.6-preview-455 175 9/22/2025
2025.0.6-preview-454 304 9/17/2025
2025.0.6-preview-441 131 9/14/2025
2025.0.6-preview-440 147 9/14/2025
2025.0.6-preview-406 176 9/2/2025
2025.0.6-preview-401 153 9/2/2025
2025.0.6-preview-400 168 9/2/2025
2025.0.6-preview-369 219 8/27/2025
2025.0.6-preview-368 208 8/27/2025
2025.0.6-preview-334 165 8/18/2025
2025.0.6-preview-333 110 7/27/2025
2025.0.6-preview-332 482 7/24/2025
2025.0.6-preview-331 496 7/24/2025
2025.0.6-preview-328 497 7/24/2025
2025.0.6-preview-327 345 7/21/2025
2025.0.6-preview-326 347 7/21/2025
2025.0.6-preview-325 248 7/20/2025
2025.0.6-preview-324 257 7/20/2025
2025.0.6-preview-322 259 7/20/2025
2025.0.6-preview-321 262 7/19/2025
2025.0.6-preview-320 255 7/19/2025
2025.0.6-preview-319 170 7/17/2025
2025.0.6-preview-317 158 7/17/2025
2025.0.6-preview-316 164 7/17/2025
2025.0.6-preview-315 163 7/17/2025
2025.0.6-preview-314 159 7/17/2025
2025.0.6-preview-313 151 7/17/2025
2025.0.6-preview-312 157 7/16/2025
2025.0.5 181 7/10/2025
2025.0.5-preview-307 99 7/5/2025
2025.0.4 107 7/5/2025
2025.0.4-preview-305 105 7/4/2025
2025.0.4-preview-304 165 7/1/2025
2025.0.4-preview-299 153 5/31/2025
2025.0.4-preview-298 126 5/30/2025
2025.0.4-preview-296 159 5/30/2025
2025.0.4-preview-295 177 5/29/2025
2025.0.4-preview-293 165 5/26/2025
2025.0.4-preview-292 178 5/26/2025
2025.0.3 140 2/10/2025
2025.0.3-preview-288 127 2/10/2025
2025.0.2 141 1/21/2025
2025.0.2-preview-278 123 1/21/2025
2025.0.2-preview-277 137 12/16/2024
2025.0.1-rc-243301701 365 11/25/2024
2024.0.14.6 141 11/25/2024
2024.0.14.6-rc-243031001 175 10/29/2024
2024.0.14.6-rc-243030701 128 10/29/2024
2024.0.14.6-rc-242840501 102 10/10/2024
2024.0.14.6-rc-242820305 124 10/8/2024
2024.0.14.6-rc-242771401 176 10/3/2024
2024.0.14.6-rc-242770501 133 10/3/2024
2024.0.14.6-rc-242770201 128 10/3/2024
2024.0.14.6-rc-242761801 118 10/2/2024
2024.0.14.6-rc-242761601 138 10/2/2024
2024.0.14.6-rc-242761501 127 10/2/2024
2024.0.14.6-rc-242761401 127 10/2/2024
2024.0.14.6-rc-242760701 127 10/2/2024
2024.0.14.6-rc-242751002 124 10/1/2024
2024.0.14.6-rc-242750901 129 10/1/2024
2024.0.14.6-rc-242750502 131 10/1/2024
2024.0.14.6-rc-242750201 132 10/1/2024
2024.0.14.6-rc-242741501 135 9/30/2024
2024.0.14.6-rc-242730701 141 9/29/2024
2024.0.14.6-preview-2730501 109 9/29/2024
2024.0.14.6-preview-2701501 131 9/26/2024
2024.0.14.6-preview-2620901 167 9/18/2024
2024.0.14.6-preview-2570701 147 9/13/2024
2024.0.14.6-preview-2510703 140 9/7/2024
2024.0.14.6-preview-2480501 154 9/4/2024
2024.0.14.6-preview-2430401 155 8/30/2024
2024.0.14.6-preview-242730701 111 9/29/2024
2024.0.14.6-preview-2421703 118 8/29/2024
2024.0.14.6-preview-2421701 124 8/29/2024
2024.0.14.6-preview-2420901 118 8/29/2024
2024.0.14.6-preview-2390101 156 8/26/2024
2024.0.14.6-preview-2381603 137 8/25/2024
2024.0.14.6-preview-2341601 182 8/21/2024
2024.0.14.6-preview-2321602 148 8/20/2024
2024.0.14.6-preview-2190801 165 8/6/2024
2024.0.14.6-preview-2041501 130 7/22/2024
2024.0.14.6-preview-1920603 177 7/10/2024
2024.0.14.6-preview-1920301 139 7/10/2024
2024.0.14.6-preview-1911302 149 7/9/2024
2024.0.14.6-preview-1901001 168 7/8/2024
2024.0.14.6-preview-1900901 127 7/8/2024
2024.0.14.6-preview-1900801 125 7/8/2024
2024.0.14.6-preview-1860304 135 7/4/2024
2024.0.14.5 212 7/1/2024
2024.0.14.5-preview-1811601 143 6/29/2024
2024.0.14.5-preview-1810501 159 6/29/2024
2024.0.14.5-preview-180132 140 6/28/2024
2024.0.14.5-preview-180131 137 6/28/2024
2024.0.14.5-preview-180121 135 6/28/2024
2024.0.14.4 166 6/27/2024
2024.0.14.4-preview-7 125 6/27/2024
2024.0.14.3 152 6/21/2024
2024.0.14.1 136 6/6/2024
2024.0.14.1-preview 138 6/6/2024
2024.0.13.8-preview 135 6/6/2024
2024.0.13.1-preview-0146 136 6/6/2024
2024.0.12.15803-preview-03 134 6/6/2024
2024.0.12.15608 153 6/4/2024
2024.0.12.15515 194 6/3/2024
2024.0.12.15220 146 5/31/2024
2024.0.12.15220-alpha31-240... 124 5/31/2024
2024.0.12.14911 176 5/28/2024
2024.0.12.14910-alpha28-240... 151 5/28/2024
2024.0.12.14823 146 5/27/2024
2024.0.12.14522-alpha7-2405... 150 5/24/2024
2024.0.12.14514-alpha6-2405... 143 5/24/2024
2024.0.12.14511 152 5/24/2024
2024.0.12.14314 163 5/22/2024
2024.0.12.14114 174 5/20/2024
2024.0.12.12815 196 5/7/2024
2024.0.12.12814 160 5/7/2024