diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4325175..e84b712 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,7 @@ on: jobs: build: - runs-on: windows-latest + runs-on: windows-2022 steps: - uses: actions/checkout@v6 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fda6da8..060f665 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -39,7 +39,7 @@ jobs: build-desktop: needs: validate - runs-on: windows-latest + runs-on: windows-2022 permissions: contents: read diff --git a/Directory.Build.targets b/Directory.Build.targets new file mode 100644 index 0000000..cf89a6d --- /dev/null +++ b/Directory.Build.targets @@ -0,0 +1,6 @@ + + + + $(NoWarn);CS1591 + + diff --git a/OpenSourceToolkit.Converters/ImageConverter.cs b/OpenSourceToolkit.Converters/ImageConverter.cs index aaaea13..e7f1d7c 100644 --- a/OpenSourceToolkit.Converters/ImageConverter.cs +++ b/OpenSourceToolkit.Converters/ImageConverter.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Drawing; using System.Drawing.Imaging; using System.IO; @@ -6,9 +6,18 @@ namespace OpenSourceToolkit.Converters { + /// + /// Provides basic image conversion helpers for file and byte-array inputs. + /// [SupportedOSPlatform("windows")] public static class ImageConverter { + /// + /// Converts an image file to the specified output format. + /// + /// Path to the source image file. + /// Path where the converted image should be saved. + /// Image format to use for the output file. public static void Convert(string inputPath, string outputPath, ImageFormat format) { using (var image = Image.FromFile(inputPath)) @@ -17,6 +26,12 @@ public static void Convert(string inputPath, string outputPath, ImageFormat form } } + /// + /// Converts image bytes to the specified output format. + /// + /// Source image bytes. + /// Image format to use for the converted bytes. + /// The converted image bytes. public static byte[] Convert(byte[] inputBytes, ImageFormat format) { using (var inputStream = new MemoryStream(inputBytes)) diff --git a/OpenSourceToolkit.Converters/ImageProcessingOptionsBuilder.cs b/OpenSourceToolkit.Converters/ImageProcessingOptionsBuilder.cs index 0475264..0100dd0 100644 --- a/OpenSourceToolkit.Converters/ImageProcessingOptionsBuilder.cs +++ b/OpenSourceToolkit.Converters/ImageProcessingOptionsBuilder.cs @@ -1,4 +1,4 @@ -namespace OpenSourceToolkit.Converters +namespace OpenSourceToolkit.Converters { /// /// Fluent builder for ImageProcessingOptions. @@ -12,18 +12,35 @@ public class ImageProcessingOptionsBuilder // Output Settings // ═══════════════════════════════════════════════════════════════════════════ + /// + /// Sets the output image format. + /// + /// Output format name, such as "png" or "jpg". + /// The current builder instance. public ImageProcessingOptionsBuilder WithFormat(string format) { _options.Format = format; return this; } + /// + /// Sets the output image quality. + /// + /// Output quality value. + /// The current builder instance. public ImageProcessingOptionsBuilder WithQuality(int quality) { _options.Quality = quality; return this; } + /// + /// Sets resize options for the output image. + /// + /// Optional target width. + /// Optional target height. + /// Whether to preserve the original aspect ratio. + /// The current builder instance. public ImageProcessingOptionsBuilder WithResize(int? width, int? height, bool maintainAspectRatio = true) { _options.Width = width; @@ -36,24 +53,46 @@ public ImageProcessingOptionsBuilder WithResize(int? width, int? height, bool ma // Adjustments // ═══════════════════════════════════════════════════════════════════════════ + /// + /// Sets the brightness adjustment. + /// + /// Brightness adjustment value. + /// The current builder instance. public ImageProcessingOptionsBuilder WithBrightness(int brightness) { _options.Brightness = brightness; return this; } + /// + /// Sets the contrast adjustment. + /// + /// Contrast adjustment value. + /// The current builder instance. public ImageProcessingOptionsBuilder WithContrast(int contrast) { _options.Contrast = contrast; return this; } + /// + /// Sets the saturation adjustment. + /// + /// Saturation adjustment value. + /// The current builder instance. public ImageProcessingOptionsBuilder WithSaturation(int saturation) { _options.Saturation = saturation; return this; } + /// + /// Sets brightness, contrast, and saturation adjustments. + /// + /// Brightness adjustment value. + /// Contrast adjustment value. + /// Saturation adjustment value. + /// The current builder instance. public ImageProcessingOptionsBuilder WithAdjustments(int brightness, int contrast, int saturation) { _options.Brightness = brightness; @@ -66,18 +105,33 @@ public ImageProcessingOptionsBuilder WithAdjustments(int brightness, int contras // Filters // ═══════════════════════════════════════════════════════════════════════════ + /// + /// Enables or disables grayscale conversion. + /// + /// Whether grayscale conversion is enabled. + /// The current builder instance. public ImageProcessingOptionsBuilder WithGrayscale(bool enabled = true) { _options.Grayscale = enabled; return this; } + /// + /// Enables or disables sepia conversion. + /// + /// Whether sepia conversion is enabled. + /// The current builder instance. public ImageProcessingOptionsBuilder WithSepia(bool enabled = true) { _options.Sepia = enabled; return this; } + /// + /// Enables or disables color inversion. + /// + /// Whether color inversion is enabled. + /// The current builder instance. public ImageProcessingOptionsBuilder WithInvert(bool enabled = true) { _options.Invert = enabled; @@ -88,12 +142,22 @@ public ImageProcessingOptionsBuilder WithInvert(bool enabled = true) // Blur / Sharpen // ═══════════════════════════════════════════════════════════════════════════ + /// + /// Sets the blur radius. + /// + /// Blur radius value. + /// The current builder instance. public ImageProcessingOptionsBuilder WithBlur(int radius) { _options.BlurRadius = radius; return this; } + /// + /// Sets the sharpen amount. + /// + /// Sharpen amount value. + /// The current builder instance. public ImageProcessingOptionsBuilder WithSharpen(int amount) { _options.SharpenAmount = amount; @@ -104,24 +168,46 @@ public ImageProcessingOptionsBuilder WithSharpen(int amount) // Transform // ═══════════════════════════════════════════════════════════════════════════ + /// + /// Sets the rotation angle. + /// + /// Rotation angle in degrees. + /// The current builder instance. public ImageProcessingOptionsBuilder WithRotation(int angle) { _options.RotationAngle = angle; return this; } + /// + /// Enables or disables horizontal flipping. + /// + /// Whether horizontal flipping is enabled. + /// The current builder instance. public ImageProcessingOptionsBuilder WithFlipHorizontal(bool enabled = true) { _options.FlipHorizontal = enabled; return this; } + /// + /// Enables or disables vertical flipping. + /// + /// Whether vertical flipping is enabled. + /// The current builder instance. public ImageProcessingOptionsBuilder WithFlipVertical(bool enabled = true) { _options.FlipVertical = enabled; return this; } + /// + /// Sets rotation and flip options. + /// + /// Rotation angle in degrees. + /// Whether horizontal flipping is enabled. + /// Whether vertical flipping is enabled. + /// The current builder instance. public ImageProcessingOptionsBuilder WithTransform(int rotationAngle, bool flipHorizontal, bool flipVertical) { _options.RotationAngle = rotationAngle; @@ -134,6 +220,14 @@ public ImageProcessingOptionsBuilder WithTransform(int rotationAngle, bool flipH // Crop // ═══════════════════════════════════════════════════════════════════════════ + /// + /// Enables cropping and sets the crop rectangle. + /// + /// Crop origin on the x-axis. + /// Crop origin on the y-axis. + /// Crop width. + /// Crop height. + /// The current builder instance. public ImageProcessingOptionsBuilder WithCrop(int x, int y, int width, int height) { _options.CropEnabled = true; @@ -144,6 +238,10 @@ public ImageProcessingOptionsBuilder WithCrop(int x, int y, int width, int heigh return this; } + /// + /// Disables cropping. + /// + /// The current builder instance. public ImageProcessingOptionsBuilder WithCropDisabled() { _options.CropEnabled = false; @@ -154,6 +252,16 @@ public ImageProcessingOptionsBuilder WithCropDisabled() // Watermark // ═══════════════════════════════════════════════════════════════════════════ + /// + /// Enables a text watermark and sets its options. + /// + /// Watermark text. + /// Watermark position. + /// Watermark opacity. + /// Watermark font size. + /// Watermark color. + /// Watermark padding. + /// The current builder instance. public ImageProcessingOptionsBuilder WithTextWatermark( string text, WatermarkPosition position = WatermarkPosition.BottomRight, @@ -173,6 +281,14 @@ public ImageProcessingOptionsBuilder WithTextWatermark( return this; } + /// + /// Enables an image watermark and sets its options. + /// + /// Watermark image bytes. + /// Watermark position. + /// Watermark opacity. + /// Watermark padding. + /// The current builder instance. public ImageProcessingOptionsBuilder WithImageWatermark( byte[] imageBytes, WatermarkPosition position = WatermarkPosition.BottomRight, @@ -188,6 +304,10 @@ public ImageProcessingOptionsBuilder WithImageWatermark( return this; } + /// + /// Disables watermarking. + /// + /// The current builder instance. public ImageProcessingOptionsBuilder WithWatermarkDisabled() { _options.WatermarkEnabled = false; @@ -198,12 +318,23 @@ public ImageProcessingOptionsBuilder WithWatermarkDisabled() // Phase 3 Effects // ═══════════════════════════════════════════════════════════════════════════ + /// + /// Enables or disables automatic image enhancement. + /// + /// Whether automatic enhancement is enabled. + /// The current builder instance. public ImageProcessingOptionsBuilder WithAutoEnhance(bool enabled = true) { _options.AutoEnhance = enabled; return this; } + /// + /// Enables vignette and sets its options. + /// + /// Vignette radius. + /// Vignette softness. + /// The current builder instance. public ImageProcessingOptionsBuilder WithVignette(int radius = 50, int softness = 50) { _options.Vignette = true; @@ -212,12 +343,21 @@ public ImageProcessingOptionsBuilder WithVignette(int radius = 50, int softness return this; } + /// + /// Disables vignette. + /// + /// The current builder instance. public ImageProcessingOptionsBuilder WithVignetteDisabled() { _options.Vignette = false; return this; } + /// + /// Enables posterization and sets the number of color levels. + /// + /// Number of posterization levels. + /// The current builder instance. public ImageProcessingOptionsBuilder WithPosterize(int levels = 4) { _options.Posterize = true; @@ -225,12 +365,21 @@ public ImageProcessingOptionsBuilder WithPosterize(int levels = 4) return this; } + /// + /// Disables posterization. + /// + /// The current builder instance. public ImageProcessingOptionsBuilder WithPosterizeDisabled() { _options.Posterize = false; return this; } + /// + /// Enables edge detection and sets its radius. + /// + /// Edge detection radius. + /// The current builder instance. public ImageProcessingOptionsBuilder WithEdgeDetect(int radius = 1) { _options.EdgeDetect = true; @@ -238,6 +387,10 @@ public ImageProcessingOptionsBuilder WithEdgeDetect(int radius = 1) return this; } + /// + /// Disables edge detection. + /// + /// The current builder instance. public ImageProcessingOptionsBuilder WithEdgeDetectDisabled() { _options.EdgeDetect = false; @@ -248,6 +401,12 @@ public ImageProcessingOptionsBuilder WithEdgeDetectDisabled() // Background Removal // ═══════════════════════════════════════════════════════════════════════════ + /// + /// Enables background removal and sets its options. + /// + /// Background color to remove. + /// Color matching tolerance. + /// The current builder instance. public ImageProcessingOptionsBuilder WithBackgroundRemoval(string backgroundColor = "transparent", int tolerance = 10) { _options.RemoveBackground = true; @@ -256,6 +415,10 @@ public ImageProcessingOptionsBuilder WithBackgroundRemoval(string backgroundColo return this; } + /// + /// Disables background removal. + /// + /// The current builder instance. public ImageProcessingOptionsBuilder WithBackgroundRemovalDisabled() { _options.RemoveBackground = false; @@ -266,6 +429,11 @@ public ImageProcessingOptionsBuilder WithBackgroundRemovalDisabled() // Metadata // ═══════════════════════════════════════════════════════════════════════════ + /// + /// Enables or disables metadata stripping. + /// + /// Whether metadata stripping is enabled. + /// The current builder instance. public ImageProcessingOptionsBuilder WithStripMetadata(bool enabled = true) { _options.StripMetadata = enabled; @@ -276,6 +444,11 @@ public ImageProcessingOptionsBuilder WithStripMetadata(bool enabled = true) // ICO Multi-size // ═══════════════════════════════════════════════════════════════════════════ + /// + /// Enables multi-size ICO generation. + /// + /// Optional ICO sizes to generate. + /// The current builder instance. public ImageProcessingOptionsBuilder WithMultiSizeIco(int[] sizes = null) { _options.GenerateMultiSizeIco = true; @@ -286,6 +459,10 @@ public ImageProcessingOptionsBuilder WithMultiSizeIco(int[] sizes = null) return this; } + /// + /// Disables multi-size ICO generation. + /// + /// The current builder instance. public ImageProcessingOptionsBuilder WithMultiSizeIcoDisabled() { _options.GenerateMultiSizeIco = false; @@ -299,6 +476,7 @@ public ImageProcessingOptionsBuilder WithMultiSizeIcoDisabled() /// /// Builds and returns the configured ImageProcessingOptions. /// + /// The configured image processing options. public ImageProcessingOptions Build() { return _options; @@ -307,6 +485,7 @@ public ImageProcessingOptions Build() /// /// Creates a new builder instance. /// + /// A new image processing options builder. public static ImageProcessingOptionsBuilder Create() { return new ImageProcessingOptionsBuilder(); @@ -315,6 +494,7 @@ public static ImageProcessingOptionsBuilder Create() /// /// Creates a builder pre-configured for preview (PNG format, no resize/output settings). /// + /// A builder configured for preview output. public static ImageProcessingOptionsBuilder ForPreview() { return new ImageProcessingOptionsBuilder().WithFormat("png"); @@ -323,6 +503,9 @@ public static ImageProcessingOptionsBuilder ForPreview() /// /// Creates a builder pre-configured for batch conversion (format and resize only). /// + /// Output format name. + /// Output quality value. + /// A builder configured for batch conversion. public static ImageProcessingOptionsBuilder ForBatch(string format, int quality = 90) { return new ImageProcessingOptionsBuilder() @@ -334,7 +517,51 @@ public static ImageProcessingOptionsBuilder ForBatch(string format, int quality /// Creates options for single image editing with all effect parameters. /// /// Output format (e.g., "png", "jpg") + /// Output quality value. /// Include resize/format/quality settings (false for preview) + /// Whether resize settings are enabled. + /// Optional resize width. + /// Optional resize height. + /// Whether to preserve the original aspect ratio. + /// Brightness adjustment value. + /// Contrast adjustment value. + /// Saturation adjustment value. + /// Whether grayscale conversion is enabled. + /// Whether sepia conversion is enabled. + /// Whether color inversion is enabled. + /// Blur radius value. + /// Sharpen amount value. + /// Rotation angle in degrees. + /// Whether horizontal flipping is enabled. + /// Whether vertical flipping is enabled. + /// Whether cropping is enabled. + /// Crop origin on the x-axis. + /// Crop origin on the y-axis. + /// Crop width. + /// Crop height. + /// Whether watermarking is enabled. + /// Optional watermark text. + /// Optional watermark image bytes. + /// Watermark position. + /// Watermark opacity. + /// Watermark font size. + /// Watermark color. + /// Watermark padding. + /// Whether automatic enhancement is enabled. + /// Whether vignette is enabled. + /// Vignette radius. + /// Vignette softness. + /// Whether posterization is enabled. + /// Number of posterization levels. + /// Whether edge detection is enabled. + /// Edge detection radius. + /// Whether background removal is enabled. + /// Background color to remove. + /// Color matching tolerance. + /// Whether metadata stripping is enabled. + /// Whether multi-size ICO generation is enabled. + /// Optional ICO sizes to generate. + /// The configured image processing options. public static ImageProcessingOptions BuildSingleImageOptions( // Output settings string format,