diff --git a/src/Avalonia.Base/Media/Imaging/BitmapMemory.cs b/src/Avalonia.Base/Media/Imaging/BitmapMemory.cs
index 1032081b6e..174998a31e 100644
--- a/src/Avalonia.Base/Media/Imaging/BitmapMemory.cs
+++ b/src/Avalonia.Base/Media/Imaging/BitmapMemory.cs
@@ -14,7 +14,11 @@ internal class BitmapMemory : IDisposable
Format = format;
AlphaFormat = alphaFormat;
Size = size;
- RowBytes = (size.Width * format.BitsPerPixel + 7) / 8;
+
+ var bytesPerPixel = (format.BitsPerPixel + 7) / 8;
+
+ RowBytes = 4 * ((size.Width * bytesPerPixel + 3) / 4);
+
_memorySize = RowBytes * size.Height;
Address = Marshal.AllocHGlobal(_memorySize);
GC.AddMemoryPressure(_memorySize);
diff --git a/tests/Avalonia.RenderTests/Media/BitmapMemoryTests.cs b/tests/Avalonia.RenderTests/Media/BitmapMemoryTests.cs
new file mode 100644
index 0000000000..75592660e6
--- /dev/null
+++ b/tests/Avalonia.RenderTests/Media/BitmapMemoryTests.cs
@@ -0,0 +1,20 @@
+using Avalonia.Media.Imaging;
+using Avalonia.Platform;
+using Xunit;
+
+namespace Avalonia.Skia.RenderTests;
+
+public class BitmapMemoryTests
+{
+ [InlineData(PixelFormatEnum.Bgr24, AlphaFormat.Opaque)]
+ [InlineData(PixelFormatEnum.Bgr555, AlphaFormat.Opaque)]
+ [InlineData(PixelFormatEnum.Bgr565, AlphaFormat.Opaque)]
+ [InlineData(PixelFormatEnum.BlackWhite, AlphaFormat.Opaque)]
+ [Theory]
+ internal void Should_Align_RowBytes_To_Four_Bytes(PixelFormatEnum pixelFormatEnum, AlphaFormat alphaFormat)
+ {
+ var bitmapMemory = new BitmapMemory(new PixelFormat(pixelFormatEnum), alphaFormat, new PixelSize(33, 1));
+
+ Assert.True(bitmapMemory.RowBytes % 4 == 0);
+ }
+}
diff --git a/tests/Avalonia.Skia.RenderTests/Avalonia.Skia.RenderTests.csproj b/tests/Avalonia.Skia.RenderTests/Avalonia.Skia.RenderTests.csproj
index aedeef4f4c..60082ce2c8 100644
--- a/tests/Avalonia.Skia.RenderTests/Avalonia.Skia.RenderTests.csproj
+++ b/tests/Avalonia.Skia.RenderTests/Avalonia.Skia.RenderTests.csproj
@@ -16,6 +16,9 @@
Media\EffectTests.cs
+
+ Media\BitmapMemoryTests.cs
+