diff --git a/src/ImageSharp/Common/Helpers/RiffHelper.cs b/src/ImageSharp/Common/Helpers/RiffHelper.cs
new file mode 100644
index 000000000..6354ebd66
--- /dev/null
+++ b/src/ImageSharp/Common/Helpers/RiffHelper.cs
@@ -0,0 +1,117 @@
+// Copyright (c) Six Labors.
+// Licensed under the Six Labors Split License.
+
+using System.Buffers.Binary;
+using System.Text;
+
+namespace SixLabors.ImageSharp.Common.Helpers;
+
+internal class RiffHelper
+{
+ ///
+ /// The header bytes identifying RIFF file.
+ ///
+ public static readonly uint RiffFourCc = 0x52_49_46_46;
+
+ public static void WriteRiffFile(Stream stream, string formType, Action func) =>
+ WriteChunk(stream, RiffFourCc, s =>
+ {
+ s.Write(Encoding.ASCII.GetBytes(formType));
+ func(s);
+ });
+
+ public static void WriteChunk(Stream stream, uint fourCc, Action func)
+ {
+ Span buffer = stackalloc byte[4];
+
+ // write the fourCC
+ BinaryPrimitives.WriteUInt32LittleEndian(buffer, fourCc);
+ stream.Write(buffer);
+
+ long sizePosition = stream.Position;
+ stream.Position += 4;
+
+ func(stream);
+
+ long position = stream.Position;
+ stream.Position = sizePosition;
+
+ uint dataSize = (uint)(position - sizePosition - 4);
+
+ // padding
+ if (dataSize % 2 == 1)
+ {
+ stream.WriteByte(0);
+ position++;
+ }
+
+ BinaryPrimitives.WriteUInt32LittleEndian(buffer, dataSize);
+ stream.Write(buffer);
+
+ stream.Position = position;
+ }
+
+ public static void WriteChunk(Stream stream, uint fourCc, ReadOnlySpan data)
+ {
+ Span buffer = stackalloc byte[4];
+
+ // write the fourCC
+ BinaryPrimitives.WriteUInt32LittleEndian(buffer, fourCc);
+ stream.Write(buffer);
+ uint size = (uint)data.Length;
+ BinaryPrimitives.WriteUInt32LittleEndian(buffer, size);
+ stream.Write(buffer);
+ stream.Write(data);
+
+ // padding
+ if (size % 2 == 1)
+ {
+ stream.WriteByte(0);
+ }
+ }
+
+ public static unsafe void WriteChunk(Stream stream, uint fourCc, in TStruct chunk)
+ where TStruct : unmanaged
+ {
+ fixed (TStruct* ptr = &chunk)
+ {
+ WriteChunk(stream, fourCc, new Span(ptr, sizeof(TStruct)));
+ }
+ }
+
+ public static long BeginWriteChunk(Stream stream, uint fourCc)
+ {
+ Span buffer = stackalloc byte[4];
+
+ // write the fourCC
+ BinaryPrimitives.WriteUInt32LittleEndian(buffer, fourCc);
+ stream.Write(buffer);
+
+ long sizePosition = stream.Position;
+ stream.Position += 4;
+
+ return sizePosition;
+ }
+
+ public static void EndWriteChunk(Stream stream, long sizePosition)
+ {
+ Span buffer = stackalloc byte[4];
+
+ long position = stream.Position;
+ stream.Position = sizePosition;
+
+ uint dataSize = (uint)(position - sizePosition - 4);
+
+ // padding
+ if (dataSize % 2 == 1)
+ {
+ stream.WriteByte(0);
+ position++;
+ }
+
+ BinaryPrimitives.WriteUInt32LittleEndian(buffer, dataSize);
+ stream.Write(buffer);
+
+ stream.Position = position;
+ }
+}