A library for reading and manipulating IMG archive files from GTA games (GTA3, Vice City, San Andreas).
$ dotnet add package GtaImgA C# library for reading and manipulating IMG archive files from GTA games (GTA III, Vice City, San Andreas).

dotnet add package GtaImg
Or via Package Manager:
Install-Package GtaImg
The library targets multiple frameworks for maximum compatibility:
| Framework | Version |
|---|---|
| .NET Framework | 4.5.2, 4.7.2, 4.8.1 |
| .NET Standard | 2.0 |
| .NET Core | 3.1 |
| .NET | 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 |
├── GtaImg.sln # Solution file
├── src/
│ ├── GtaImg/ # Main library
│ │ ├── GtaImg.csproj
│ │ ├── IMGArchive.cs # Main archive class
│ │ ├── IMGEntry.cs # Entry structure
│ │ └── IMGException.cs # Custom exception
│ └── GtaImgTool/ # GUI application (WPF)
│ ├── GtaImgTool.csproj
│ └── ...
└── tests/
└── GtaImg.Tests/ # NUnit tests
├── GtaImg.Tests.csproj
└── IMGArchiveTests.cs
A Windows desktop application for viewing and editing IMG archives with a modern dark theme.
dotnet run --project src/GtaImgTool/GtaImgTool.csproj
| Shortcut | Action |
|---|---|
| Ctrl+N | New Archive |
| Ctrl+O | Open Archive |
| Ctrl+S | Save Archive |
| Ctrl+W | Close Archive |
| Ctrl+A | Select All |
| Delete | Delete Selected |
| F5 | Refresh |
dotnet build
dotnet test
Or with verbose output:
dotnet test --verbosity normal
using GtaImg;
// Open a VER2 archive (GTA SA)
using var archive = new IMGArchive("gta3.img");
// List all entries
foreach (var entry in archive)
{
Console.WriteLine($"{entry.Name} - {entry.SizeInBytes} bytes");
}
using GtaImg;
// Open for reading and writing
using var archive = new IMGArchive("gta3.img", IMGArchive.IMGMode.ReadWrite);
// Make changes...
archive.Sync(); // Save changes (also called automatically on Dispose)
using GtaImg;
// Create a new VER2 archive
using var archive = IMGArchive.CreateArchive("new_archive.img", IMGArchive.IMGVersion.VER2);
// Add files
archive.ImportFile("mymodel.dff");
archive.ImportFile("mytexture.txd");
using GtaImg;
using var archive = new IMGArchive("gta3.img");
// Read by name
byte[]? data = archive.ReadEntryData("player.dff");
// Or use a stream
using var stream = archive.OpenEntry("player.dff");
if (stream != null)
{
// Process stream...
}
using GtaImg;
using var archive = new IMGArchive("gta3.img");
// Extract a single file
archive.ExtractEntry("player.dff", @"C:\extracted\player.dff");
// Extract all files
archive.ExtractAll(@"C:\extracted\all_files");
using GtaImg;
using var archive = new IMGArchive("gta3.img", IMGArchive.IMGMode.ReadWrite);
// Import from file system
archive.ImportFile(@"C:\mods\custom.dff", "custom.dff");
// Or add from byte array
byte[] myData = File.ReadAllBytes("myfile.txd");
archive.AddEntry("myfile.txd", myData);
using GtaImg;
using var archive = new IMGArchive("gta3.img", IMGArchive.IMGMode.ReadWrite);
// Remove an entry
archive.RemoveEntry("unwanted.dff");
// Rename an entry
archive.RenameEntry("old_name.txd", "new_name.txd");
After removing entries, the archive may have "holes" (unused space). Use Pack() to defragment:
using GtaImg;
using var archive = new IMGArchive("gta3.img", IMGArchive.IMGMode.ReadWrite);
// Remove some entries
archive.RemoveEntry("file1.dff");
archive.RemoveEntry("file2.dff");
// Pack to eliminate holes
uint newSize = archive.Pack();
Console.WriteLine($"Archive size is now {newSize} blocks");
using GtaImg;
using var archive = new IMGArchive("gta3.img");
if (archive.ContainsEntry("player.dff"))
{
Console.WriteLine("Entry exists!");
}
// Get entry info
var entry = archive.GetEntryByName("player.dff");
if (entry.HasValue)
{
Console.WriteLine($"Offset: {entry.Value.Offset} blocks");
Console.WriteLine($"Size: {entry.Value.Size} blocks ({entry.Value.SizeInBytes} bytes)");
}
using GtaImg;
// Before opening
var version = IMGArchive.GuessIMGVersion("unknown.img");
Console.WriteLine(version == IMGArchive.IMGVersion.VER2 ? "GTA SA format" : "GTA 3/VC format");
// Or from an open archive
using var archive = new IMGArchive("unknown.img");
Console.WriteLine($"Archive version: {archive.Version}");
.dir (directory/header) and .img (data).img file with "VER2" magic headerThis library is released under the MIT License.
This library is a C# port of the original C++ libgtaformats library by David "Alemarius Nexus" Lerch.