Skip to content

Commit 70d636d

Browse files
Merge pull request #1384 from SixLabors/dl/fix-bmp-files-size
Fixed setting the file size when the BMP encoder has a color palette
2 parents 581efcf + 7a8615b commit 70d636d

File tree

4 files changed

+36
-9
lines changed

4 files changed

+36
-9
lines changed

src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ public void Encode<TPixel>(Image<TPixel> image, Stream stream, CancellationToken
171171

172172
var fileHeader = new BmpFileHeader(
173173
type: BmpConstants.TypeMarkers.Bitmap,
174-
fileSize: BmpFileHeader.Size + infoHeaderSize + infoHeader.ImageSize,
174+
fileSize: BmpFileHeader.Size + infoHeaderSize + colorPaletteSize + infoHeader.ImageSize,
175175
reserved: 0,
176176
offset: BmpFileHeader.Size + infoHeaderSize + colorPaletteSize);
177177

tests/ImageSharp.Tests/Formats/Bmp/BmpDecoderTests.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,9 @@ public void BmpDecoder_CanDecodeBmpv2<TPixel>(TestImageProvider<TPixel> provider
348348
using (Image<TPixel> image = provider.GetImage(BmpDecoder))
349349
{
350350
image.DebugSave(provider);
351-
image.CompareToOriginal(provider);
351+
352+
// Do not validate. Reference files will fail validation.
353+
image.CompareToOriginal(provider, new MagickReferenceDecoder(false));
352354
}
353355
}
354356

tests/ImageSharp.Tests/Formats/Bmp/BmpEncoderTests.cs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
using SixLabors.ImageSharp.Processing;
1111
using SixLabors.ImageSharp.Processing.Processors.Quantization;
1212
using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison;
13-
13+
using SixLabors.ImageSharp.Tests.TestUtilities.ReferenceCodecs;
1414
using Xunit;
1515
using Xunit.Abstractions;
1616

@@ -200,10 +200,18 @@ public void Encode_8BitColor_WithWuQuantizer<TPixel>(TestImageProvider<TPixel> p
200200
Quantizer = new WuQuantizer()
201201
};
202202
string actualOutputFile = provider.Utility.SaveTestOutputFile(image, "bmp", encoder, appendPixelTypeToFileName: false);
203+
204+
// Use the default decoder to test our encoded image. This verifies the content.
205+
// We do not verify the reference image though as some are invalid.
203206
IImageDecoder referenceDecoder = TestEnvironment.GetReferenceDecoder(actualOutputFile);
204207
using (var referenceImage = Image.Load<TPixel>(actualOutputFile, referenceDecoder))
205208
{
206-
referenceImage.CompareToReferenceOutput(ImageComparer.TolerantPercentage(0.01f), provider, extension: "bmp", appendPixelTypeToFileName: false);
209+
referenceImage.CompareToReferenceOutput(
210+
ImageComparer.TolerantPercentage(0.01f),
211+
provider,
212+
extension: "bmp",
213+
appendPixelTypeToFileName: false,
214+
decoder: new MagickReferenceDecoder(false));
207215
}
208216
}
209217
}
@@ -226,10 +234,18 @@ public void Encode_8BitColor_WithOctreeQuantizer<TPixel>(TestImageProvider<TPixe
226234
Quantizer = new OctreeQuantizer()
227235
};
228236
string actualOutputFile = provider.Utility.SaveTestOutputFile(image, "bmp", encoder, appendPixelTypeToFileName: false);
237+
238+
// Use the default decoder to test our encoded image. This verifies the content.
239+
// We do not verify the reference image though as some are invalid.
229240
IImageDecoder referenceDecoder = TestEnvironment.GetReferenceDecoder(actualOutputFile);
230241
using (var referenceImage = Image.Load<TPixel>(actualOutputFile, referenceDecoder))
231242
{
232-
referenceImage.CompareToReferenceOutput(ImageComparer.TolerantPercentage(0.01f), provider, extension: "bmp", appendPixelTypeToFileName: false);
243+
referenceImage.CompareToReferenceOutput(
244+
ImageComparer.TolerantPercentage(0.01f),
245+
provider,
246+
extension: "bmp",
247+
appendPixelTypeToFileName: false,
248+
decoder: new MagickReferenceDecoder(false));
233249
}
234250
}
235251
}

tests/ImageSharp.Tests/TestUtilities/ReferenceCodecs/MagickReferenceDecoder.cs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,18 @@ namespace SixLabors.ImageSharp.Tests.TestUtilities.ReferenceCodecs
1616
{
1717
public class MagickReferenceDecoder : IImageDecoder
1818
{
19+
private readonly bool validate;
20+
21+
public MagickReferenceDecoder()
22+
: this(true)
23+
{
24+
}
25+
26+
public MagickReferenceDecoder(bool validate)
27+
{
28+
this.validate = validate;
29+
}
30+
1931
public static MagickReferenceDecoder Instance { get; } = new MagickReferenceDecoder();
2032

2133
private static void FromRgba32Bytes<TPixel>(Configuration configuration, Span<byte> rgbaBytes, IMemoryGroup<TPixel> destinationGroup)
@@ -57,10 +69,7 @@ public Image<TPixel> Decode<TPixel>(Configuration configuration, Stream stream)
5769
{
5870
var bmpReadDefines = new BmpReadDefines
5971
{
60-
// See https://github.com/SixLabors/ImageSharp/issues/1380
61-
// Validation fails on Ubuntu despite identical header generation
62-
// on all platforms.
63-
IgnoreFileSize = !TestEnvironment.IsWindows
72+
IgnoreFileSize = !this.validate
6473
};
6574

6675
var settings = new MagickReadSettings();

0 commit comments

Comments
 (0)