diff --git a/src/ImageSharp/Formats/Heif/Heif4CharCode.cs b/src/ImageSharp/Formats/Heif/Heif4CharCode.cs
index 2b14a62725..d6d31ef1d3 100644
--- a/src/ImageSharp/Formats/Heif/Heif4CharCode.cs
+++ b/src/ImageSharp/Formats/Heif/Heif4CharCode.cs
@@ -248,4 +248,14 @@ public enum Heif4CharCode : uint
///
free = 0x66726565U,
+ ///
+ /// ICC Color Profile.
+ ///
+ rICC = 0x72494343U,
+
+ ///
+ /// ICC Color Profile.
+ ///
+ prof = 0x70726F66U,
+
}
diff --git a/src/ImageSharp/Formats/Heif/Heif4CharCode.tt b/src/ImageSharp/Formats/Heif/Heif4CharCode.tt
index 6f15a33ab9..9f8555f33b 100644
--- a/src/ImageSharp/Formats/Heif/Heif4CharCode.tt
+++ b/src/ImageSharp/Formats/Heif/Heif4CharCode.tt
@@ -54,6 +54,8 @@
"pict", "Picture handler type",
"uuid", "Unique Identifier",
"free", "Free space",
+ "rICC", "ICC Color Profile",
+ "prof", "ICC Color Profile",
};
#>
diff --git a/src/ImageSharp/Formats/Heif/HeifDecoderCore.cs b/src/ImageSharp/Formats/Heif/HeifDecoderCore.cs
index fb81a943c5..8a8c8e29f6 100644
--- a/src/ImageSharp/Formats/Heif/HeifDecoderCore.cs
+++ b/src/ImageSharp/Formats/Heif/HeifDecoderCore.cs
@@ -7,6 +7,7 @@ using System.Text;
using SixLabors.ImageSharp.IO;
using SixLabors.ImageSharp.Memory;
using SixLabors.ImageSharp.Metadata;
+using SixLabors.ImageSharp.Metadata.Profiles.Icc;
using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Formats.Heif;
@@ -442,8 +443,17 @@ internal sealed class HeifDecoderCore : IImageDecoderInternals
properties.Add(new KeyValuePair(Heif4CharCode.pixi, new int[] { channelCount, bitsPerPixel }));
break;
- case Heif4CharCode.altt:
case Heif4CharCode.colr:
+ Heif4CharCode profileType = (Heif4CharCode)BinaryPrimitives.ReadUInt32BigEndian(buffer);
+ if (profileType is Heif4CharCode.rICC or Heif4CharCode.prof)
+ {
+ byte[] iccData = new byte[itemLength - 4];
+ buffer[4..].CopyTo(iccData);
+ this.metadata.IccProfile = new IccProfile(iccData);
+ }
+
+ break;
+ case Heif4CharCode.altt:
case Heif4CharCode.imir:
case Heif4CharCode.irot:
case Heif4CharCode.iscl: