//процедура захвата спрайта private void CaptureSprite(int x1, int y1, int x2, int y2, bool autoname) { if (x1 > x2) { int i = x1; x1 = x2; x2 = i; } if (y1 > y2) { int i = y1; y1 = y2; y2 = i; } int xsz = x2 - x1 + 1; int ysz = y2 - y1 + 1; int[,] spr = new int[xsz + 10, ysz + 2]; int j = 0; for (int y = y1; y <= y2; y++) { int i = 0; for (int x = x1; x <= x2; x++) { spr[i, j] = img.GetPixel(x, y).R == MainForm.ColorDisable.R && img.GetPixel(x, y).G == MainForm.ColorDisable.G && img.GetPixel(x, y).B == MainForm.ColorDisable.B ? 0 : 1; i++; } j++; } //перемещаем спрайт в левый верхний угол и проверяем наличие изображения bool e = false; for (int i = 0; i < xsz; i++) { for (int y = 0; y < ysz; y++) { if (spr[0, y] == 1) { e = true; } } if (e) { break; } for (int y = 0; y < ysz; y++) { for (int x = 0; x < xsz - 1; x++) { spr[x, y] = spr[x + 1, y]; spr[x + 1, y] = 0; } } } //в спрайте нет пикселей if (!e) { MessageBox.Show("Sprite is empty.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } e = false; for (int i = 0; i < xsz; i++) { for (int x = 0; x < xsz; x++) { if (spr[x, 0] == 1) { e = true; } } if (e) { break; } for (int y = 0; y < ysz - 1; y++) { for (int x = 0; x < xsz; x++) { spr[x, y] = spr[x, y + 1]; spr[x, y + 1] = 0; } } } //двигаем спрайт на один пиксель вправо и вниз for (int y = ysz - 2; y >= 0; y--) { for (int x = xsz - 2; x >= 0; x--) { spr[x + 1, y + 1] = spr[x, y]; spr[x, y] = 0; } } //уточняем реальные размеры спрайта xsz += 10; ysz += 2; for (int y = ysz - 1; y >= 0; y--) { e = false; for (int x = 0; x < xsz; x++) { if (spr[x, y] == 1) { e = true; } } if (e) { ysz = y + 2; break; } } for (int x = xsz - 1; x >= 0; x--) { e = false; for (int y = 0; y < ysz; y++) { if (spr[x, y] == 1) { e = true; } } if (e) { xsz = x + 2; break; } } //создаем маску спрайта int[,] msk = new int[xsz + 2, ysz + 2]; for (int y = 0; y < ysz; y++) { for (int x = 0; x < xsz; x++) { if (spr[x, y] == 1) { msk[x + 1, y + 1] = 1; msk[x + 1, y] = 1; msk[x + 1, y + 2] = 1; msk[x, y + 1] = 1; msk[x + 2, y + 1] = 1; } } } My.FillArrayArea(msk, 0, 0, 2); //сохранение спрайта MainForm.Sprite s = new MainForm.Sprite(); if (!autoname) { InputBox i = new InputBox("Sprite name", SpriteName); if (i.ShowDialog() != DialogResult.OK) { return; } if (i.ResultString == "") { MessageBox.Show("The name of the sprite can't be empty!", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (MainForm.FindSprite(i.ResultString) != null) { MessageBox.Show("Sprite with the same name already exists!", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } SpriteName = i.ResultString; s.Name = SpriteName; } //автоматическое именование спрайтов else { while (MainForm.FindSprite(SpriteName + IntToDecStr(AutoNameNum)) != null) { AutoNameNum++; } s.Name = SpriteName + IntToDecStr(AutoNameNum); } s.SpriteSize = new Size(xsz, ysz); //монохромный спрайт с маской if (SpriteType0.Checked) { s.Type = 0; s.PixelLayer = new int[xsz, ysz]; for (int y = 0; y < ysz; y++) { for (int x = 0; x < xsz; x++) { if (msk[x + 1, y + 1] != 2) { s.PixelLayer[x, y] = spr[x, y] == 0 ? 2 : 1; } } } } MainForm main = this.Owner as MainForm; main.AddInSpriteList(s); }
//автоматический захват спрайтов private void AutoCaptureButton_Click(object sender, EventArgs e) { if (img != null) { StartPoint.X = -1; StartPoint.Y = -1; //предварительный просмотр выбора спрайтов int[,] i = new int[img.Width + 4, img.Height + 4]; for (int y = 0; y < img.Height; y++) { for (int x = 0; x < img.Width; x++) { i[x + 2, y + 2] = img.GetPixel(x, y).R == MainForm.ColorDisable.R && img.GetPixel(x, y).G == MainForm.ColorDisable.G && img.GetPixel(x, y).B == MainForm.ColorDisable.B ? 0 : 1; } } for (int y = 0; y < i.GetLength(1); y++) { for (int x = 0; x < i.GetLength(0); x++) { if ((i[x, y] & 1) == 1) { i[x + 1, y] |= 2; i[x - 1, y] |= 2; i[x, y + 1] |= 2; i[x, y - 1] |= 2; } } } My.FillArrayArea(i, 0, 0, -1); for (int y = 1; y < img.Height + 1; y++) { for (int x = 1; x < img.Width + 1; x++) { if (i[x, y] != -1) { i[x, y] = 0; } } } Bitmap b = new Bitmap(img); Graphics g = Graphics.FromImage(b); Pen p = new Pen(Color.Red); List <Rectangle> l = new List <Rectangle>(); for (int y = 0; y < i.GetLength(1); y++) { for (int x = 0; x < i.GetLength(0); x++) { if (i[x, y] == 0) { Rectangle r = My.FillArrayArea(i, x, y, 1); r.X--; r.Y--; r.Width--; r.Height--; l.Add(r); g.DrawRectangle(p, r); } } } ImageBox.Image = b; //сохранение спрайтов if (MessageBox.Show("Capture this sprites?", "Capture", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { InputBox ib = new InputBox("Name prefix for sprites", SpriteName); if (ib.ShowDialog() == DialogResult.OK) { SpriteName = ib.ResultString; AutoNameNum = 0; foreach (Rectangle r in l) { CaptureSprite(r.X, r.Y, r.X + r.Width, r.Y + r.Height, true); AutoNameNum++; } } } ImageBox.Image = img; } }