diff --git a/src/ImageSharp/PixelFormats/Rgba48.cs b/src/ImageSharp/PixelFormats/Rgba48.cs
new file mode 100644
index 000000000..4408415b1
--- /dev/null
+++ b/src/ImageSharp/PixelFormats/Rgba48.cs
@@ -0,0 +1,249 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System;
+using System.Numerics;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+namespace SixLabors.ImageSharp.PixelFormats
+{
+ ///
+ /// Packed pixel type containing three 16-bit unsigned normalized values ranging from 0 to 635535.
+ ///
+ /// Ranges from [0, 0, 0, 1] to [1, 1, 1, 1] in vector form.
+ ///
+ ///
+ [StructLayout(LayoutKind.Sequential)]
+ public struct Rgba48 : IPixel
+ {
+ private const float Max = 65535F;
+
+ ///
+ /// Gets or sets the red component.
+ ///
+ public ushort R;
+
+ ///
+ /// Gets or sets the green component.
+ ///
+ public ushort G;
+
+ ///
+ /// Gets or sets the blue component.
+ ///
+ public ushort B;
+
+ ///
+ /// Initializes a new instance of the struct.
+ ///
+ /// The red component.
+ /// The green component.
+ /// The blue component.
+ public Rgba48(ushort r, ushort g, ushort b)
+ : this()
+ {
+ this.R = r;
+ this.G = g;
+ this.B = b;
+ }
+
+ ///
+ /// Initializes a new instance of the struct.
+ ///
+ /// The red component.
+ /// The green component.
+ /// The blue component.
+ public Rgba48(float r, float g, float b)
+ : this()
+ {
+ this.R = (ushort)MathF.Round(r.Clamp(0, 1) * Max);
+ this.G = (ushort)MathF.Round(g.Clamp(0, 1) * Max);
+ this.B = (ushort)MathF.Round(b.Clamp(0, 1) * Max);
+ }
+
+ ///
+ /// Initializes a new instance of the struct.
+ ///
+ /// The vector containing the components values.
+ public Rgba48(Vector3 vector)
+ : this(vector.X, vector.Y, vector.Z)
+ {
+ }
+
+ ///
+ /// Compares two objects for equality.
+ ///
+ /// The on the left side of the operand.
+ /// The on the right side of the operand.
+ ///
+ /// True if the parameter is equal to the parameter; otherwise, false.
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static bool operator ==(Rgba48 left, Rgba48 right)
+ {
+ return left.R == right.R
+ && left.G == right.G
+ && left.B == right.B;
+ }
+
+ ///
+ /// Compares two objects for equality.
+ ///
+ /// The on the left side of the operand.
+ /// The on the right side of the operand.
+ ///
+ /// True if the parameter is not equal to the parameter; otherwise, false.
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static bool operator !=(Rgba48 left, Rgba48 right)
+ {
+ return left.R != right.R
+ || left.G != right.G
+ || left.B != right.B;
+ }
+
+ ///
+ public PixelOperations CreatePixelOperations() => new PixelOperations();
+
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public void PackFromScaledVector4(Vector4 vector)
+ {
+ this.PackFromVector4(vector);
+ }
+
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public Vector4 ToScaledVector4()
+ {
+ return this.ToVector4();
+ }
+
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public Vector4 ToVector4()
+ {
+ return new Vector4(this.R / Max, this.G / Max, this.B / Max, 1);
+ }
+
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public void PackFromVector4(Vector4 vector)
+ {
+ vector = Vector4.Clamp(vector, Vector4.Zero, Vector4.One) * Max;
+ this.R = (ushort)MathF.Round(vector.X);
+ this.G = (ushort)MathF.Round(vector.Y);
+ this.B = (ushort)MathF.Round(vector.Z);
+ }
+
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public void PackFromRgba32(Rgba32 source)
+ {
+ this.PackFromVector4(source.ToVector4());
+ }
+
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public void PackFromArgb32(Argb32 source)
+ {
+ this.PackFromVector4(source.ToVector4());
+ }
+
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public void PackFromBgra32(Bgra32 source)
+ {
+ this.PackFromVector4(source.ToVector4());
+ }
+
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public void PackFromRgba64(Rgba64 source) => this.PackFromScaledVector4(source.ToScaledVector4());
+
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public void ToRgb24(ref Rgb24 dest)
+ {
+ Vector4 vector = this.ToVector4() * 255F;
+ dest.R = (byte)MathF.Round(vector.X);
+ dest.G = (byte)MathF.Round(vector.Y);
+ dest.B = (byte)MathF.Round(vector.Z);
+ }
+
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ Vector4 vector = this.ToVector4() * 255F;
+ dest.R = (byte)MathF.Round(vector.X);
+ dest.G = (byte)MathF.Round(vector.Y);
+ dest.B = (byte)MathF.Round(vector.Z);
+ dest.A = (byte)MathF.Round(vector.W);
+ }
+
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public void ToArgb32(ref Argb32 dest)
+ {
+ Vector4 vector = this.ToVector4() * 255F;
+ dest.R = (byte)MathF.Round(vector.X);
+ dest.G = (byte)MathF.Round(vector.Y);
+ dest.B = (byte)MathF.Round(vector.Z);
+ dest.A = (byte)MathF.Round(vector.W);
+ }
+
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public void ToBgr24(ref Bgr24 dest)
+ {
+ Vector4 vector = this.ToVector4() * 255F;
+ dest.R = (byte)MathF.Round(vector.X);
+ dest.G = (byte)MathF.Round(vector.Y);
+ dest.B = (byte)MathF.Round(vector.Z);
+ }
+
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public void ToBgra32(ref Bgra32 dest)
+ {
+ Vector4 vector = this.ToVector4() * 255F;
+ dest.R = (byte)MathF.Round(vector.X);
+ dest.G = (byte)MathF.Round(vector.Y);
+ dest.B = (byte)MathF.Round(vector.Z);
+ dest.A = (byte)MathF.Round(vector.W);
+ }
+
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public void ToRgba64(ref Rgba64 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
+
+ ///
+ public override bool Equals(object obj)
+ {
+ return obj is Rgba48 rgba48 && this.Equals(rgba48);
+ }
+
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public bool Equals(Rgba48 other)
+ {
+ return this.R == other.R
+ && this.G == other.G
+ && this.B == other.B;
+ }
+
+ ///
+ public override string ToString() => this.ToVector4().ToString();
+
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public override int GetHashCode()
+ {
+ return HashHelpers.Combine(
+ this.R.GetHashCode(),
+ HashHelpers.Combine(this.G.GetHashCode(), this.B.GetHashCode()));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/PixelFormats/Rgba64.cs b/src/ImageSharp/PixelFormats/Rgba64.cs
index 3202a5628..c059c6aa5 100644
--- a/src/ImageSharp/PixelFormats/Rgba64.cs
+++ b/src/ImageSharp/PixelFormats/Rgba64.cs
@@ -9,7 +9,7 @@ using System.Runtime.InteropServices;
namespace SixLabors.ImageSharp.PixelFormats
{
///
- /// Packed pixel type containing four 16-bit unsigned normalized values ranging from 0 to 1.
+ /// Packed pixel type containing four 16-bit unsigned normalized values ranging from 0 to 635535.
///
/// Ranges from [0, 0, 0, 0] to [1, 1, 1, 1] in vector form.
///