diff --git a/src/ImageSharp.Formats.Bmp/BmpEncoder.cs b/src/ImageSharp.Formats.Bmp/BmpEncoder.cs
index ea1342272..2c0bb5b5d 100644
--- a/src/ImageSharp.Formats.Bmp/BmpEncoder.cs
+++ b/src/ImageSharp.Formats.Bmp/BmpEncoder.cs
@@ -14,17 +14,27 @@ namespace ImageSharp.Formats
/// The encoder can currently only write 24-bit rgb images to streams.
public class BmpEncoder : IImageEncoder
{
- ///
- /// Gets or sets the number of bits per pixel.
- ///
- public BmpBitsPerPixel BitsPerPixel { get; set; } = BmpBitsPerPixel.Pixel24;
-
///
public void Encode(Image image, Stream stream, IEncoderOptions options)
where TColor : struct, IPixel
{
- BmpEncoderCore encoder = new BmpEncoderCore();
- encoder.Encode(image, stream, this.BitsPerPixel);
+ IBmpEncoderOptions bmpOptions = BmpEncoderOptions.Create(options);
+
+ this.Encode(image, stream, bmpOptions);
+ }
+
+ ///
+ /// Encodes the image to the specified stream from the .
+ ///
+ /// The pixel format.
+ /// The to encode from.
+ /// The to encode the image data to.
+ /// The options for the encoder.
+ public void Encode(Image image, Stream stream, IBmpEncoderOptions options)
+ where TColor : struct, IPackedPixel, IEquatable
+ {
+ BmpEncoderCore encoder = new BmpEncoderCore(options);
+ encoder.Encode(image, stream);
}
}
}
diff --git a/src/ImageSharp.Formats.Bmp/BmpEncoderCore.cs b/src/ImageSharp.Formats.Bmp/BmpEncoderCore.cs
index 02d270a0a..9696eb66d 100644
--- a/src/ImageSharp.Formats.Bmp/BmpEncoderCore.cs
+++ b/src/ImageSharp.Formats.Bmp/BmpEncoderCore.cs
@@ -16,34 +16,40 @@ namespace ImageSharp.Formats
internal sealed class BmpEncoderCore
{
///
- /// The number of bits per pixel.
+ /// The options for the encoder.
///
- private BmpBitsPerPixel bmpBitsPerPixel;
+ private IBmpEncoderOptions options;
///
/// The amount to pad each row by.
///
private int padding;
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The options for the encoder.
+ public BmpEncoderCore(IBmpEncoderOptions options)
+ {
+ this.options = options ?? new BmpEncoderOptions();
+ }
+
///
/// Encodes the image to the specified stream from the .
///
/// The pixel format.
/// The to encode from.
/// The to encode the image data to.
- /// The
- public void Encode(ImageBase image, Stream stream, BmpBitsPerPixel bitsPerPixel)
+ public void Encode(ImageBase image, Stream stream)
where TColor : struct, IPixel
{
Guard.NotNull(image, nameof(image));
Guard.NotNull(stream, nameof(stream));
- this.bmpBitsPerPixel = bitsPerPixel;
-
// Cast to int will get the bytes per pixel
- short bpp = (short)(8 * (int)bitsPerPixel);
+ short bpp = (short)(8 * (int)this.options.BitsPerPixel);
int bytesPerLine = 4 * (((image.Width * bpp) + 31) / 32);
- this.padding = bytesPerLine - (image.Width * (int)bitsPerPixel);
+ this.padding = bytesPerLine - (image.Width * (int)this.options.BitsPerPixel);
// Do not use IDisposable pattern here as we want to preserve the stream.
EndianBinaryWriter writer = new EndianBinaryWriter(Endianness.LittleEndian, stream);
@@ -128,7 +134,7 @@ namespace ImageSharp.Formats
{
using (PixelAccessor pixels = image.Lock())
{
- switch (this.bmpBitsPerPixel)
+ switch (this.options.BitsPerPixel)
{
case BmpBitsPerPixel.Pixel32:
this.Write32Bit(writer, pixels);
diff --git a/src/ImageSharp.Formats.Bmp/BmpEncoderOptions.cs b/src/ImageSharp.Formats.Bmp/BmpEncoderOptions.cs
new file mode 100644
index 000000000..f0106b481
--- /dev/null
+++ b/src/ImageSharp.Formats.Bmp/BmpEncoderOptions.cs
@@ -0,0 +1,51 @@
+//
+// Copyright (c) James Jackson-South and contributors.
+// Licensed under the Apache License, Version 2.0.
+//
+
+namespace ImageSharp.Formats
+{
+ ///
+ /// Encapsulates the options for the .
+ ///
+ public sealed class BmpEncoderOptions : EncoderOptions, IBmpEncoderOptions
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public BmpEncoderOptions()
+ {
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The options for the encoder.
+ private BmpEncoderOptions(IEncoderOptions options)
+ : base(options)
+ {
+ }
+
+ ///
+ /// Gets or sets the number of bits per pixel.
+ ///
+ public BmpBitsPerPixel BitsPerPixel { get; set; } = BmpBitsPerPixel.Pixel24;
+
+ ///
+ /// Converts the options to a instance with a cast
+ /// or by creating a new instance with the specfied options.
+ ///
+ /// The options for the encoder.
+ /// The options for the .
+ internal static IBmpEncoderOptions Create(IEncoderOptions options)
+ {
+ IBmpEncoderOptions bmpOptions = options as IBmpEncoderOptions;
+ if (bmpOptions != null)
+ {
+ return bmpOptions;
+ }
+
+ return new BmpEncoderOptions(options);
+ }
+ }
+}
diff --git a/src/ImageSharp.Formats.Bmp/IBmpEncoderOptions.cs b/src/ImageSharp.Formats.Bmp/IBmpEncoderOptions.cs
new file mode 100644
index 000000000..6cf37cbae
--- /dev/null
+++ b/src/ImageSharp.Formats.Bmp/IBmpEncoderOptions.cs
@@ -0,0 +1,18 @@
+//
+// Copyright (c) James Jackson-South and contributors.
+// Licensed under the Apache License, Version 2.0.
+//
+
+namespace ImageSharp.Formats
+{
+ ///
+ /// Encapsulates the options for the .
+ ///
+ public interface IBmpEncoderOptions : IEncoderOptions
+ {
+ ///
+ /// Gets the number of bits per pixel.
+ ///
+ BmpBitsPerPixel BitsPerPixel { get; }
+ }
+}
diff --git a/tests/ImageSharp.Tests/Formats/Bmp/BitmapTests.cs b/tests/ImageSharp.Tests/Formats/Bmp/BitmapTests.cs
index c1275335d..7579cc86e 100644
--- a/tests/ImageSharp.Tests/Formats/Bmp/BitmapTests.cs
+++ b/tests/ImageSharp.Tests/Formats/Bmp/BitmapTests.cs
@@ -7,8 +7,6 @@ using ImageSharp.Formats;
namespace ImageSharp.Tests
{
- using System.IO;
-
using Xunit;
public class BitmapTests : FileTestBase
@@ -16,7 +14,7 @@ namespace ImageSharp.Tests
public static readonly TheoryData BitsPerPixel
= new TheoryData
{
- BmpBitsPerPixel.Pixel24 ,
+ BmpBitsPerPixel.Pixel24,
BmpBitsPerPixel.Pixel32
};
@@ -31,7 +29,7 @@ namespace ImageSharp.Tests
string filename = file.GetFileNameWithoutExtension(bitsPerPixel);
using (Image image = file.CreateImage())
{
- image.Save($"{path}/{filename}.bmp", new BmpEncoder { BitsPerPixel = bitsPerPixel });
+ image.Save($"{path}/{filename}.bmp", new BmpEncoderOptions { BitsPerPixel = bitsPerPixel });
}
}
}