From fae15ae88aa1b8131076159b199f51c1d32ac70e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=88=B0=E9=98=9F=E7=9A=84=E5=81=B6=E5=83=8F-=E5=B2=9B?= =?UTF-8?q?=E9=A3=8E=E9=85=B1!?= Date: Thu, 14 Dec 2023 22:51:52 +0800 Subject: [PATCH] Fixed AlphaMask --- src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs | 55 +++++++++----------- 1 file changed, 24 insertions(+), 31 deletions(-) diff --git a/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs b/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs index dcccc83631..fe1c9e0be1 100644 --- a/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs +++ b/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs @@ -3,16 +3,13 @@ using System.Buffers; using System.Buffers.Binary; -using System.IO; using System.Runtime.InteropServices; -using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Common.Helpers; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Quantization; -using static System.Net.Mime.MediaTypeNames; namespace SixLabors.ImageSharp.Formats.Bmp; @@ -380,6 +377,11 @@ internal sealed class BmpEncoderCore : IImageEncoderInternals this.Write1BitPixelData(configuration, stream, image); break; } + + if (this.processedAlphaMask) + { + ProcessedAlphaMask(stream, image); + } } private IMemoryOwner AllocateRow(int width, int bytesPerPixel) @@ -488,11 +490,6 @@ internal sealed class BmpEncoderCore : IImageEncoderInternals { this.Write8BitColor(configuration, stream, image, colorPalette); } - - if (this.processedAlphaMask) - { - ProcessedAlphaMask(stream, image); - } } /// @@ -610,11 +607,6 @@ internal sealed class BmpEncoderCore : IImageEncoderInternals stream.WriteByte(0); } } - - if (this.processedAlphaMask) - { - ProcessedAlphaMask(stream, image); - } } /// @@ -672,11 +664,6 @@ internal sealed class BmpEncoderCore : IImageEncoderInternals stream.WriteByte(0); } } - - if (this.processedAlphaMask) - { - ProcessedAlphaMask(stream, image); - } } /// @@ -727,11 +714,6 @@ internal sealed class BmpEncoderCore : IImageEncoderInternals stream.WriteByte(0); } } - - if (this.processedAlphaMask) - { - ProcessedAlphaMask(stream, image); - } } /// @@ -779,7 +761,6 @@ internal sealed class BmpEncoderCore : IImageEncoderInternals private static void ProcessedAlphaMask(Stream stream, Image image) where TPixel : unmanaged, IPixel { - Rgba32 rgba = default; int arrayWidth = image.Width / 8; int padding = arrayWidth % 4; if (padding is not 0) @@ -791,19 +772,31 @@ internal sealed class BmpEncoderCore : IImageEncoderInternals for (int y = image.Height - 1; y >= 0; y--) { mask.Clear(); - for (int x = 0; x < image.Width; x++) + Span row = image.GetRootFramePixelBuffer().DangerousGetRowSpan(y); + + for (int i = 0; i < arrayWidth; i++) { - int bit = x % 8; - int i = x / 8; - TPixel pixel = image[x, y]; - pixel.ToRgba32(ref rgba); - if (rgba.A is not 0) + int x = i * 8; + + for (int j = 0; j < 8; j++) { - mask[i] &= unchecked((byte)(0b10000000 >> bit)); + WriteAlphaMask(row[x + j], ref mask[i], j); } } stream.Write(mask); + stream.Skip(padding); + } + } + + private static void WriteAlphaMask(in TPixel pixel, ref byte mask, in int index) + where TPixel : unmanaged, IPixel + { + Rgba32 rgba = default; + pixel.ToRgba32(ref rgba); + if (rgba.A is 0) + { + mask |= unchecked((byte)(0b10000000 >> index)); } } }