diff --git a/ArcFormats/ArcFormats.csproj b/ArcFormats/ArcFormats.csproj
index e154c359..2a28fc93 100644
--- a/ArcFormats/ArcFormats.csproj
+++ b/ArcFormats/ArcFormats.csproj
@@ -205,6 +205,7 @@
+
diff --git a/ArcFormats/ImageRCG.cs b/ArcFormats/ImageRCG.cs
new file mode 100644
index 00000000..b6e66078
--- /dev/null
+++ b/ArcFormats/ImageRCG.cs
@@ -0,0 +1,64 @@
+using System.ComponentModel.Composition;
+using System.IO;
+using System.Windows.Media;
+using GameRes.Compression;
+
+namespace GameRes.Formats
+{
+ [Export(typeof(ImageFormat))]
+ public class ImageRCG : ImageFormat
+ {
+ public override string Tag
+ {
+ get { return "RCG"; }
+ }
+
+ public override string Description
+ {
+ get { return "Rave RCG image format"; }
+ }
+
+ public override uint Signature
+ {
+ get { return 0x31520018; }
+ }
+
+ public override bool CanWrite
+ {
+ get { return false; }
+ }
+
+ public override ImageMetaData ReadMetaData(IBinaryStream stream)
+ {
+ stream.Position = 4;
+ var meta = new ImageMetaData();
+ meta.BPP = 24;
+ meta.Width = stream.ReadUInt16();
+ meta.Height = stream.ReadUInt16();
+ meta.OffsetX = 0;
+ meta.OffsetY = 0;
+ // Skip 8 bytes unknown fields
+ stream.Position += 8;
+ var compressed_size = stream.ReadUInt32();
+ return compressed_size != stream.Length - 24 ? null : meta;
+ }
+
+ public override ImageData Read(IBinaryStream stream, ImageMetaData info)
+ {
+ stream.Position = 20;
+ var uncompressed_size = stream.ReadUInt32();
+ var data = new byte[uncompressed_size];
+ using (var zstream = new ZLibStream(stream.AsStream, CompressionMode.Decompress, true))
+ {
+ return uncompressed_size != zstream.Read(data, 0, (int)uncompressed_size)
+ ? null
+ : ImageData.Create(info, PixelFormats.Rgb24, null, data);
+ }
+ }
+
+ public override void Write(Stream file, ImageData image)
+ {
+ throw new System.NotImplementedException("RCGFormat.Write not implemented");
+ }
+ }
+}
\ No newline at end of file