Ejemplo n.º 1
0
        static void Main(string[] args)
        {
            var bmps = new List <Bitmap>();

            foreach (var fileName in Directory.GetFiles(@"..\\RawTiles", "*.*"))
            {
                var bitmap = new Image((Bitmap)Bitmap.FromFile(fileName), true, false).Bitmap;


                var xx = new List <int>();
                var yy = new List <int>();
                {
                    var empty = true;
                    for (var x = 0; x < bitmap.Width; x++)
                    {
                        int y = 0;
                        for (; y < bitmap.Height; y++)
                        {
                            if (empty)
                            {
                                if (bitmap.GetPixel(x, y) != m_transp)
                                {
                                    xx.Add(x);
                                    empty = false;
                                    break;
                                }
                            }
                            else
                            {
                                if (bitmap.GetPixel(x, y) != m_transp)
                                {
                                    break;
                                }
                            }
                        }
                        if (!empty && y == bitmap.Height)
                        {
                            if (x - xx[xx.Count - 1] < TILE_SIZE)
                            {
                                break;
                            }
                            xx.Add(x);
                            empty = true;
                        }
                    }
                }
                {
                    var empty = true;
                    for (var y = 0; y < bitmap.Height; y++)
                    {
                        int x = 0;
                        for (; x < xx[xx.Count - 1]; x++)
                        {
                            if (empty)
                            {
                                if (bitmap.GetPixel(x, y) != m_transp)
                                {
                                    yy.Add(y);
                                    empty = false;
                                    break;
                                }
                            }
                            else
                            {
                                if (bitmap.GetPixel(x, y) != m_transp)
                                {
                                    break;
                                }
                            }
                        }
                        if (!empty && x == xx[xx.Count - 1])
                        {
                            if (y - yy[yy.Count - 1] < TILE_SIZE)
                            {
                                break;
                            }
                            yy.Add(y);
                            empty = true;
                        }
                    }
                    yy.Add(bitmap.Height - 1);
                }
                for (var ix = 0; ix < xx.Count - 1; ix += 2)
                {
                    for (var iy = 0; iy < yy.Count - 1; iy += 2)
                    {
                        var rct = new Rectangle(xx[ix], yy[iy], xx[ix + 1] - xx[ix], yy[iy + 1] - yy[iy]);
                        var bmp = GetTile(bitmap, rct);
                        if (bmp != null)
                        {
                            bmps.Add(bmp);
                        }
                    }
                }

                #region vis

//using (var gr = Graphics.FromImage(bitmap))
                //{
                //	{
                //		var x = 0;
                //		for (var index = 0; index < xx.Count; index += 2)
                //		{
                //			var x1 = xx[index];
                //			gr.FillRectangle(Brushes.Aqua, x, 0, x1 - x, bitmap.Height);
                //			if (index == xx.Count - 1)
                //			{
                //				break;
                //			}
                //			x = xx[index + 1];
                //		}

                //	}
                //	{
                //		var y = 0;
                //		for (var index = 0; index < yy.Count; index += 2)
                //		{
                //			var y1 = yy[index];
                //			gr.FillRectangle(Brushes.Aquamarine, 0, y, bitmap.Width, y1 - y);
                //			if (index == yy.Count - 1)
                //			{
                //				break;
                //			}
                //			y = yy[index + 1];
                //		}

                //	}
                //}
                //bitmap.Save(@"d:\\bmp.png", ImageFormat.Png);

                #endregion
            }

            var ideal   = bmps.Where(x => x.Width == TILE_SIZE && x.Height == TILE_SIZE).ToArray();
            var texture = new Bitmap(TILE_SIZE * 2, TILE_SIZE * 2, PixelFormat.Format32bppPArgb);
            for (var x = 0; x < TILE_SIZE; x++)
            {
                for (var y = 0; y < TILE_SIZE; y++)
                {
                    var pixels = ideal.Select(b => b.GetPixel(x, y)).Where(c => c != m_transp).ToArray();
                    if (pixels.Length == 0)
                    {
                        continue;
                    }
                    var average = Average(pixels);
                    var ordered = pixels.GroupBy(c => Distance(c, average)).OrderByDescending(g => g.Count());
                    var first   = ordered.First();
                    if (first.Count() > 3)
                    {
                        texture.SetPixel(x + TILE_SIZE / 2, y + TILE_SIZE / 2, Average(first));
                    }
                }
            }
            texture.Save(@"d:\\text.png", ImageFormat.Png);


            var arr = GameCore.Misc.Point.Zero.GetSpiral(7).ToArray();

            foreach (var bitmap in ideal)
            {
                var b = new Bitmap(TILE_SIZE, TILE_SIZE, PixelFormat.Format32bppPArgb);
                using (var gr = Graphics.FromImage(b))
                {
                    gr.Clear(Color.Empty);
                }
                var fill = new bool[TILE_SIZE + 2, TILE_SIZE + 2];
                fill[1, 1]                 = true;
                fill[TILE_SIZE, 1]         = true;
                fill[1, TILE_SIZE]         = true;
                fill[TILE_SIZE, TILE_SIZE] = true;
                var aa   = arr.OrderBy(a => Distance(texture, bitmap, a.X, a.Y)).First();
                var flag = false;
                do
                {
                    flag = false;
                    for (var x = 0; x < TILE_SIZE; x++)
                    {
                        for (var y = 0; y < TILE_SIZE; y++)
                        {
                            if (fill[x + 1, y + 1])
                            {
                                continue;
                            }
                            if (!new GameCore.Misc.Point(x + 1, y + 1).AllNeighbours.Any(p => fill[p.X, p.Y]))
                            {
                                continue;
                            }
                            if (Distance(bitmap.GetPixel(x, y), texture.GetPixel(x + TILE_SIZE / 2 + aa.X, y + TILE_SIZE / 2 + aa.Y)) < 10)
                            {
                                fill[x + 1, y + 1] = true;
                                flag = true;
                            }
                            else
                            {
                                b.SetPixel(x, y, bitmap.GetPixel(x, y));
                            }
                        }
                    }
                } while (flag);

                for (var x = 0; x < TILE_SIZE; x++)
                {
                    for (var y = 0; y < TILE_SIZE; y++)
                    {
                        if (fill[x + 1, y + 1])
                        {
                            continue;
                        }
                        if (new GameCore.Misc.Point(x + 1, y + 1).AllNeighbours.All(p => fill[p.X, p.Y]))
                        {
                            continue;
                        }
                        b.SetPixel(x, y, bitmap.GetPixel(x, y));
                    }
                }


                b.Save(@"d:\\u" + m_uu++ + ".png", ImageFormat.Png);
            }
        }
Ejemplo n.º 2
0
		static void Main(string[] args)
		{

			var bmps = new List<Bitmap>();
			foreach (var fileName in Directory.GetFiles(@"..\\RawTiles", "*.*"))
			{
				var bitmap = new Image((Bitmap)Bitmap.FromFile(fileName), true, false).Bitmap;


				var xx = new List<int>();
				var yy = new List<int>();
				{
					var empty = true;
					for (var x = 0; x < bitmap.Width; x++)
					{
						int y = 0;
						for (; y < bitmap.Height; y++)
						{

							if (empty)
							{
								if (bitmap.GetPixel(x, y) != m_transp)
								{
									xx.Add(x);
									empty = false;
									break;
								}
							}
							else
							{
								if (bitmap.GetPixel(x, y) != m_transp)
								{
									break;
								}
							}
						}
						if (!empty && y == bitmap.Height)
						{
							if (x - xx[xx.Count - 1] < TILE_SIZE)
							{
								break;
							}
							xx.Add(x);
							empty = true;
						}
					}
				}
				{
					var empty = true;
					for (var y = 0; y < bitmap.Height; y++)
					{
						int x = 0;
						for (; x < xx[xx.Count - 1]; x++)
						{

							if (empty)
							{
								if (bitmap.GetPixel(x, y) != m_transp)
								{
									yy.Add(y);
									empty = false;
									break;
								}
							}
							else
							{
								if (bitmap.GetPixel(x, y) != m_transp)
								{
									break;
								}
							}
						}
						if (!empty && x == xx[xx.Count - 1])
						{
							if (y - yy[yy.Count - 1] < TILE_SIZE)
							{
								break;
							}
							yy.Add(y);
							empty = true;
						}
					}
					yy.Add(bitmap.Height-1);
				}
				for (var ix = 0; ix < xx.Count-1; ix+=2)
				{
					for (var iy = 0; iy < yy.Count-1; iy+=2)
					{
						var rct = new Rectangle(xx[ix], yy[iy], xx[ix + 1] - xx[ix], yy[iy + 1] - yy[iy]);
						var bmp = GetTile(bitmap, rct);
						if (bmp != null)
						{
							bmps.Add(bmp);
						}
					}
				}

				#region vis

//using (var gr = Graphics.FromImage(bitmap))
				//{
				//	{
				//		var x = 0;
				//		for (var index = 0; index < xx.Count; index += 2)
				//		{
				//			var x1 = xx[index];
				//			gr.FillRectangle(Brushes.Aqua, x, 0, x1 - x, bitmap.Height);
				//			if (index == xx.Count - 1)
				//			{
				//				break;
				//			}
				//			x = xx[index + 1];
				//		}

				//	}
				//	{
				//		var y = 0;
				//		for (var index = 0; index < yy.Count; index += 2)
				//		{
				//			var y1 = yy[index];
				//			gr.FillRectangle(Brushes.Aquamarine, 0, y, bitmap.Width, y1 - y);
				//			if (index == yy.Count - 1)
				//			{
				//				break;
				//			}
				//			y = yy[index + 1];
				//		}

				//	}
				//}
				//bitmap.Save(@"d:\\bmp.png", ImageFormat.Png);

				#endregion

			}

			var ideal = bmps.Where(x => x.Width == TILE_SIZE && x.Height == TILE_SIZE).ToArray();
			var texture = new Bitmap(TILE_SIZE*2, TILE_SIZE*2, PixelFormat.Format32bppPArgb);
			for (var x = 0; x < TILE_SIZE; x++)
			{
				for (var y = 0; y < TILE_SIZE; y++)
				{
					var pixels = ideal.Select(b=>b.GetPixel(x,y)).Where(c=>c!=m_transp).ToArray();
					if (pixels.Length == 0) continue;
					var average = Average(pixels);
					var ordered = pixels.GroupBy(c => Distance(c, average)).OrderByDescending(g => g.Count());
					var first = ordered.First();
					if (first.Count() > 3)
					{
						texture.SetPixel(x + TILE_SIZE / 2, y + TILE_SIZE / 2, Average(first));
					}
				}
			}
			texture.Save(@"d:\\text.png", ImageFormat.Png);


			var arr = GameCore.Misc.Point.Zero.GetSpiral(7).ToArray();

			foreach (var bitmap in ideal)
			{
				var b = new Bitmap(TILE_SIZE, TILE_SIZE, PixelFormat.Format32bppPArgb);
				using (var gr = Graphics.FromImage(b))
				{
					gr.Clear(Color.Empty);
				}
				var fill = new bool[TILE_SIZE+2, TILE_SIZE+2];
				fill[1, 1] = true;
				fill[TILE_SIZE, 1] = true;
				fill[1, TILE_SIZE] = true;
				fill[TILE_SIZE, TILE_SIZE] = true;
				var aa = arr.OrderBy(a => Distance(texture, bitmap, a.X, a.Y)).First();
				var flag = false;
				do
				{
					flag = false;
					for (var x = 0; x < TILE_SIZE; x++)
					{
						for (var y = 0; y < TILE_SIZE; y++)
						{
							if (fill[x + 1, y + 1]) continue;
							if (!new GameCore.Misc.Point(x + 1, y + 1).AllNeighbours.Any(p => fill[p.X, p.Y])) continue;
							if (Distance(bitmap.GetPixel(x, y), texture.GetPixel(x + TILE_SIZE/2 + aa.X, y + TILE_SIZE/2 + aa.Y)) < 10)
							{
								fill[x + 1, y + 1] = true;
								flag = true;
							}
							else
							{
								b.SetPixel(x, y, bitmap.GetPixel(x, y));
							}
						}
					}
				} while (flag);

				for (var x = 0; x < TILE_SIZE; x++)
				{
					for (var y = 0; y < TILE_SIZE; y++)
					{
						if (fill[x + 1, y + 1]) continue;
						if (new GameCore.Misc.Point(x + 1, y + 1).AllNeighbours.All(p => fill[p.X, p.Y])) continue;
						b.SetPixel(x, y, bitmap.GetPixel(x, y));
					}
				}

				
				b.Save(@"d:\\u" + m_uu++ + ".png", ImageFormat.Png);
			}
		}