public override void Work() { MapCanvasTile[,] tiles = canvas.Images; int rowCount = tiles.GetLength(1); int colCount = tiles.GetLength(0); ImageInfo info = new ImageInfo((colCount * canvas.MaxTiles) * 256, (rowCount * canvas.MaxTiles) * 256, 8, false); PngWriter writer = new PngWriter(File.OpenWrite(fileName), info); int lineOfs = 0; int tileLines = 256 * canvas.MaxTiles; int canvasCols = (colCount * canvas.MaxTiles) * 256; for (int tileY = 0; tileY < rowCount; tileY++) { Color[,] rows = new Color[tileLines, canvasCols]; for (int tileX = 0; tileX < colCount; tileX++) { List<MapCanvasTile.SubTile> subTiles = tiles[tileX, tileY].tiles; subTiles.Sort((a, b) => a.CompareTo(b)); for (int subTileY = 0; subTileY < canvas.MaxTiles; subTileY++) { for (int subTileX = 0; subTileX < canvas.MaxTiles; subTileX++) { int subTileIndex = (subTileX * canvas.MaxTiles) + subTileY; if (subTileIndex < subTiles.Count) { using (BlpFile blp = new BlpFile(File.OpenRead(subTiles[subTileIndex].File))) using (Bitmap bmp = blp.GetBitmap(0)) { for (int pY = 0; pY < 256; pY++) for (int pX = 0; pX < 256; pX++) rows[pY + (subTileY * 256), pX + (subTileX * 256) + (tileX * (256 * canvas.MaxTiles))] = bmp.GetPixel(pX, pY); } } } } } for (int iLine = 0; iLine < tileLines; iLine++) { byte[] compRow = new byte[canvasCols * 3]; for (int iCol = 0; iCol < canvasCols; iCol++) { Color color = rows[iLine, iCol]; int ofs = 3 * iCol; compRow[ofs] = color.R; compRow[ofs + 1] = color.G; compRow[ofs + 2] = color.B; } writer.WriteRowByte(compRow, lineOfs); lineOfs++; } } writer.End(); EventManager.Trigger_MapExportDone2D(); }