Skip to content

A lightweight C# library for detecting sprites in a transparent GIF/PNG image and creating JSON/XML spritemaps out of the detected sprites.

License

Notifications You must be signed in to change notification settings

TohnoCoding/SpriteImageParser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SpriteImageParser (SIP)

SpriteImageParser is a lightweight C# library for detecting sprite regions in raster images (e.g., PNGs, GIFs). It takes a 2D array of pixels, analyzes connected non-transparent regions, and returns bounding boxes for each detected sprite. Excellent examples of the type of spritesheets expected by this tool can be found on Sprites INC., a repository of sprite data focused on the MegaMan series of games. (Disclaimer: TohnoCoding has no relation to Sprites INC. other than acknowledging their work is awesome.)

This tool is designed to be part of an asset pipeline or editor; it does not read or write image files directly. It follows a simple "one job, one tool" philosophy.

If you're building a game development tool, editor or jam project in MonoGame or any other 2D-compatible platform, and need to break spritesheets into spritemaps without creating them by hand, this may be able to save you some time.

You can see a sample Windows-based implementation in this discussion.

TL;DR

A small, self-contained library to detect and extract sprite regions from raster images: useful for pipelines, prototyping, or editor tools. Code samples in this README file, and in the linked discussion above.


🧩 Features

  • Detects sprite regions based on alpha/transparency
  • Handles empty spacing between frames
  • Sorts results top-to-bottom, left-to-right
  • JSON and XML serialization of output
  • No runtime dependencies beyond .NET

🧪 Quick Example

// Load a Bitmap and convert to Pixel[,] array
Bitmap bm = new Bitmap("path_to_your_image.png");
Pixel[,] pixels = new Pixel[bm.Width, bm.Height];
for (int x = 0, x < bm.Width; x++)
{
    for (int y = 0; y < bm.Height; y++)
    {
        Color c = bm.GetPixel(x, y);
        pixels[x, y] = new Pixel(c.R, c.G, c.B, c.A);
    }
}

//Detect sprites in currently loaded Pixel array
List<SpriteRegion> rectangles = Parser.DetectSpritesInImage(pixels);

// Export to JSON with name prefix "Frame" and duration of 1 (time scale is user-determined)
string json = SpriteRegionExporter.serializeToJson(rectangles, "Frame", 1f);

🧱 Output Format

Detected regions are serialized into this format:

JSON:

[
    {
      "Name": "Sprite000001",
      "Duration": 1000,
      "Frame": {
        "X": 194,
        "Y": 4,
        "Width": 34,
        "Height": 41
      }
    },
    {
      "Name": "Sprite000002",
      "Duration": 1000,
      "Frame": {
        "X": 244,
        "Y": 4,
        "Width": 34,
        "Height": 41
      }
    }
]

XML:

<Spritesheet>
	<SpriteRegion>
		<Name>Sprite000001</Name>
		<Duration>1000</Duration>
		<Frame>
			<X>194</X>
			<Y>4</Y>
			<Width>34</Width>
			<Height>41</Height>
		</Frame>
	</SpriteRegion>
	<SpriteRegion>
		<Name>Sprite000001</Name>
		<Duration>1000</Duration>
		<Frame>
			<X>244</X>
			<Y>4</Y>
			<Width>34</Width>
			<Height>41</Height>
		</Frame>
	</SpriteRegion>
</Spritesheet>

⚙️ API Overview

Parser.DetectSpritesInImage(Pixel[,] pixels, int yTolerance, Pixel? transparencyMask)

  • Input: A 2D array of Pixel structs (RGBA), and a Y-axis margin value to consider sprites part of the same "horizontal group".
  • Output: A List<SpriteRegion> with detected bounding rectangles.

SpriteRegionExporter.SerializeToJson(...)

  • Serializes a list of regions to JSON.
  • Supports custom frame field name and default duration.

SpriteRegionExporter.SerializeToXml(...)

  • Outputs equivalent structure in XML.

📦 Data Types

public struct Pixel {
    public byte R, G, B, A;
}

public class SpriteRegion {
    public int X, Y, Width, Height;
    public string Name;
    public float Duration;
}

🚫 Not Included

  • This library does not load image files; pass in a Pixel[,] from your own pipeline.
  • This library does not parse or deserialize formats: it only exports.

About

A lightweight C# library for detecting sprites in a transparent GIF/PNG image and creating JSON/XML spritemaps out of the detected sprites.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages