theli said:hm.... maybe someone will help ... no sure how i should better work with such files containing tiles ... http://omploader.org/vMWxrYQ/00096
Looks like a pretty simple format. The file contains a palette, the tiles, and an image map.
4 bytes - palette offset
4 bytes - tiles offset
4 bytes - map offset
palette section - 16 colors, 2 bytes per color (15bpp BGR format)
tiles section - 32 bytes per tile (4bpp linear reverse-order codec)
map section - 1 byte width, 1 byte height, 2 bytes per tile (1 byte index, 1 byte transformations)
CODE/*
* Created by SharpDevelop.
* User: DarthNemesis
* Date: 4/29/2009
* Time: 10:04 AM
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
namespace CuldceptPic
{
ÂÂÂÂ///
ÂÂÂÂ/// Description of MainForm.
ÂÂÂÂ///
ÂÂÂÂpublic partial class MainForm : Form
ÂÂÂÂ{
ÂÂÂÂÂÂÂÂprivate Color[] palette;
ÂÂÂÂÂÂÂÂprivate Bitmap[] tiles;
ÂÂÂÂÂÂÂÂprivate Bitmap image;
ÂÂÂÂÂÂÂÂ
ÂÂÂÂÂÂÂÂpublic MainForm()
ÂÂÂÂÂÂÂÂ{
ÂÂÂÂÂÂÂÂÂÂÂÂInitializeComponent();
ÂÂÂÂÂÂÂÂ}
ÂÂÂÂÂÂÂÂ
ÂÂÂÂÂÂÂÂvoid MainFormLoad(object sender, EventArgs e)
ÂÂÂÂÂÂÂÂ{
ÂÂÂÂÂÂÂÂÂÂÂÂstring fileName = "00096";
ÂÂÂÂÂÂÂÂÂÂÂÂFileStream file;
ÂÂÂÂÂÂÂÂÂÂÂÂBinaryReader reader;
ÂÂÂÂÂÂÂÂÂÂÂÂif (!File.Exists(fileName))
ÂÂÂÂÂÂÂÂÂÂÂÂ{
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂMessageBox.Show("Cannot find file.");
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂreturn;
ÂÂÂÂÂÂÂÂÂÂÂÂ}
ÂÂÂÂÂÂÂÂÂÂÂÂfile = new FileStream(fileName, FileMode.Open, FileAccess.Read);
ÂÂÂÂÂÂÂÂÂÂÂÂreader = new BinaryReader(file);
ÂÂÂÂÂÂÂÂÂÂÂÂuint paletteOffset = reader.ReadUInt32();
ÂÂÂÂÂÂÂÂÂÂÂÂuint tilesOffset = reader.ReadUInt32();
ÂÂÂÂÂÂÂÂÂÂÂÂuint mapOffset = reader.ReadUInt32();
ÂÂÂÂÂÂÂÂÂÂÂÂ
ÂÂÂÂÂÂÂÂÂÂÂÂfile.Seek(paletteOffset, SeekOrigin.Begin);
ÂÂÂÂÂÂÂÂÂÂÂÂreader = new BinaryReader(file);
ÂÂÂÂÂÂÂÂÂÂÂÂReadPalette(reader);
ÂÂÂÂÂÂÂÂÂÂÂÂ
ÂÂÂÂÂÂÂÂÂÂÂÂfile.Seek(tilesOffset, SeekOrigin.Begin);
ÂÂÂÂÂÂÂÂÂÂÂÂreader = new BinaryReader(file);
ÂÂÂÂÂÂÂÂÂÂÂÂReadTiles(reader, mapOffset - tilesOffset);
ÂÂÂÂÂÂÂÂÂÂÂÂ
ÂÂÂÂÂÂÂÂÂÂÂÂfile.Seek(mapOffset, SeekOrigin.Begin);
ÂÂÂÂÂÂÂÂÂÂÂÂreader = new BinaryReader(file);
ÂÂÂÂÂÂÂÂÂÂÂÂReadImage(reader);
ÂÂÂÂÂÂÂÂÂÂÂÂreader.Close();
ÂÂÂÂÂÂÂÂÂÂÂÂ
ÂÂÂÂÂÂÂÂÂÂÂÂpanelImage.Width = image.Width;
ÂÂÂÂÂÂÂÂÂÂÂÂpanelImage.Height = image.Height;
ÂÂÂÂÂÂÂÂÂÂÂÂpanelImage.Invalidate();
ÂÂÂÂÂÂÂÂ}
ÂÂÂÂÂÂÂÂ
ÂÂÂÂÂÂÂÂprivate Color ReadColor(BinaryReader reader)
ÂÂÂÂÂÂÂÂ{
ÂÂÂÂÂÂÂÂÂÂÂÂushort code = reader.ReadUInt16();
ÂÂÂÂÂÂÂÂÂÂÂÂint r = (code & 0x001F) > 2;
ÂÂÂÂÂÂÂÂÂÂÂÂint b = (code & 0x7C00) >> 7;
ÂÂÂÂÂÂÂÂÂÂÂÂreturn System.Drawing.Color.FromArgb(r, g, b);
ÂÂÂÂÂÂÂÂ}
ÂÂÂÂÂÂÂÂ
ÂÂÂÂÂÂÂÂprivate void ReadPalette(BinaryReader reader)
ÂÂÂÂÂÂÂÂ{
ÂÂÂÂÂÂÂÂÂÂÂÂuint numColors = 16;
ÂÂÂÂÂÂÂÂÂÂÂÂpalette = new Color[numColors];
ÂÂÂÂÂÂÂÂÂÂÂÂfor (int i = 0; i < numColors; i++)
ÂÂÂÂÂÂÂÂÂÂÂÂ{
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂpalette = ReadColor(reader);
ÂÂÂÂÂÂÂÂÂÂÂÂ}
ÂÂÂÂÂÂÂÂ}
ÂÂÂÂÂÂÂÂ
ÂÂÂÂÂÂÂÂprivate Bitmap ReadTile(BinaryReader reader)
ÂÂÂÂÂÂÂÂ{
ÂÂÂÂÂÂÂÂÂÂÂÂBitmap tile = new Bitmap(8, 8);
ÂÂÂÂÂÂÂÂÂÂÂÂbyte remainder = 0;
ÂÂÂÂÂÂÂÂÂÂÂÂbool lowByte = true;
ÂÂÂÂÂÂÂÂÂÂÂÂfor (int y = 0; y < 8; y++)
ÂÂÂÂÂÂÂÂÂÂÂÂ{
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂfor (int x = 0; x < 8; x++)
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ{
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂbyte curColorIndex = 0;
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂif (lowByte)
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ{
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂremainder = reader.ReadByte();
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂcurColorIndex = (byte)(remainder & 0x0F);
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂremainder >>= 4;
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂlowByte = false;
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ}
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂelse
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ{
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂcurColorIndex = remainder;
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂlowByte = true;
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ}
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂtile.SetPixel(x, y, palette[curColorIndex]);
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ}
ÂÂÂÂÂÂÂÂÂÂÂÂ}
ÂÂÂÂÂÂÂÂÂÂÂÂreturn tile;
ÂÂÂÂÂÂÂÂ}
ÂÂÂÂÂÂÂÂ
ÂÂÂÂÂÂÂÂprivate void ReadTiles(BinaryReader reader, uint length)
ÂÂÂÂÂÂÂÂ{
ÂÂÂÂÂÂÂÂÂÂÂÂuint numTiles = length / 32;
ÂÂÂÂÂÂÂÂÂÂÂÂtiles = new Bitmap[numTiles];
ÂÂÂÂÂÂÂÂÂÂÂÂfor (int i = 0; i < numTiles; i++)
ÂÂÂÂÂÂÂÂÂÂÂÂ{
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂtiles = ReadTile(reader);
ÂÂÂÂÂÂÂÂÂÂÂÂ}
ÂÂÂÂÂÂÂÂ}
ÂÂÂÂÂÂÂÂ
ÂÂÂÂÂÂÂÂprivate void ReadImage(BinaryReader reader)
ÂÂÂÂÂÂÂÂ{
ÂÂÂÂÂÂÂÂÂÂÂÂint MAX_X = reader.ReadByte();
ÂÂÂÂÂÂÂÂÂÂÂÂint MAX_Y = reader.ReadByte();
ÂÂÂÂÂÂÂÂÂÂÂÂimage = new Bitmap(8*MAX_X, 8*MAX_Y);
ÂÂÂÂÂÂÂÂÂÂÂÂGraphics g = Graphics.FromImage(image);
ÂÂÂÂÂÂÂÂÂÂÂÂfor (int y = 0; y < MAX_Y; y++)
ÂÂÂÂÂÂÂÂÂÂÂÂ{
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂfor (int x = 0; x < MAX_X; x++)
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ{
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂbyte tileIndex = reader.ReadByte();
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂbyte tileModifier = reader.ReadByte();
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂSystem.Drawing.Bitmap curTile = tiles[tileIndex].Clone() as System.Drawing.Bitmap;
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂswitch (tileModifier)
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ{
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂcase 0x04:
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂcurTile.RotateFlip(System.Drawing.RotateFlipType.RotateNoneFlipX);
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂbreak;
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂcase 0x08:
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂcurTile.RotateFlip(System.Drawing.RotateFlipType.RotateNoneFlipY);
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂbreak;
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂcase 0x0C:
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂcurTile.RotateFlip(System.Drawing.RotateFlipType.RotateNoneFlipXY);
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂbreak;
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ};
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂg.DrawImageUnscaled(curTile, 8*x, 8*y);
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ}
ÂÂÂÂÂÂÂÂÂÂÂÂ}
ÂÂÂÂÂÂÂÂÂÂÂÂg.Dispose();
ÂÂÂÂÂÂÂÂ}
ÂÂÂÂÂÂÂÂ
ÂÂÂÂÂÂÂÂvoid PanelImagePaint(object sender, PaintEventArgs e)
ÂÂÂÂÂÂÂÂ{
ÂÂÂÂÂÂÂÂÂÂÂÂGraphics g = panelImage.CreateGraphics();
ÂÂÂÂÂÂÂÂÂÂÂÂg.DrawImageUnscaled(image, 0, 0);
ÂÂÂÂÂÂÂÂÂÂÂÂg.Dispose();
ÂÂÂÂÂÂÂÂ}
ÂÂÂÂ}
}