/// <summary> /// Constructor de la clase puzzle, la diferencia con el anterior es que elegiremos cuantas filas y columnas queremos, el resto es igual que el constructor anterior por lo que no necesita comentarios extra. /// </summary> /// <param name="im"> Nombre de la imagen que leeremos para después cortarla </param> /// <param name="w"> Ancho que tendrá la imagen total en pantalla </param> /// <param name="h"> Alto que tendrá la imagen total en pantalla </param> /// <param name="p_w"> Número de rectángulos horizontales de la imagen </param> /// <param name="p_h"> Número de rectángulos verticales de la imagen </param> public Puzzle(String im, int w, int h, int p_w, int p_h) { try { imagen = Image.FromFile(im); } catch { System.Console.WriteLine("Imagen no encontrada"); } width = w; height = h; piezas_width = p_w; piezas_height = p_h; tiempo = piezas_height * piezas_width * 10; pos = new int[piezas_height * piezas_width]; rect = new RectImagen[piezas_height * piezas_width]; imagenes = new Image[piezas_height * piezas_width]; for (int i = 0; i < piezas_height * piezas_width; i++) { pos[i] = -1; } Random a = new Random(); for (int i = 0; i < piezas_height * piezas_width; i++) { int n = a.Next(0, piezas_height * piezas_width); while (pos[n] != -1) { n = (n + 1) % (piezas_height * piezas_width); } pos[n] = i; } for (int i = 0; i < piezas_height * piezas_width; i++) { imagenes[i] = new Bitmap(imagen.Size.Width / piezas_width, imagen.Size.Height / piezas_height); var gra = Graphics.FromImage(imagenes[i]); int ipos = i % piezas_width; int jpos = i / piezas_width; gra.DrawImage(imagen, new Rectangle(0, 0, imagen.Size.Width / piezas_width, imagen.Size.Height / piezas_height), new Rectangle(ipos * imagen.Size.Width / piezas_width, jpos * imagen.Size.Height / piezas_height, imagen.Size.Width / piezas_width, imagen.Size.Height / piezas_height), GraphicsUnit.Pixel); gra.Dispose(); BitmapImage bi = new BitmapImage(); bi.BeginInit(); MemoryStream ms = new MemoryStream(); imagenes[i].Save(ms, ImageFormat.Bmp); ms.Seek(0, SeekOrigin.Begin); bi.StreamSource = ms; bi.EndInit(); int i_rec = pos[i] % piezas_width; int j_rec = pos[i] / piezas_width; rect[i] = new RectImagen(i_rec * width / piezas_width, j_rec * height / piezas_height, width / piezas_width, height / piezas_height, bi); rect[i].setPosicionOld(rect[i].getPosicion()); } }
/// <summary> /// Constructor de la clase Puzzle. /// </summary> /// <param name="im"> Nombre de la imagen que leeremos para después cortarla. </param> public Puzzle(String im) { //Comprobamos que se lee correctamente la imagen. try { imagen = Image.FromFile(im); } catch { System.Console.WriteLine("Imagen no encontrada"); } //Asignamos la anchura y altura de la imagen y cuantos trozos de ella haremos. width = 640; height = 480; piezas_width = 4; piezas_height = 3; tiempo = piezas_height * piezas_width * 8; //Declaramos imagenes,pos y rect con el tamaño total de imágenes cuando se corten. pos = new int[piezas_height * piezas_width]; rect = new RectImagen[piezas_height * piezas_width]; imagenes = new Image[piezas_height * piezas_width]; //Iniciamos pos a -1 para controlarlo. for (int i = 0; i < piezas_height * piezas_width; i++) { pos[i] = -1; } //Y damos números aleatorios para las posiciones. Random a = new Random(); for (int i = 0; i < piezas_height * piezas_width; i++) { int n = a.Next(0, piezas_height * piezas_width); while (pos[n] != -1) { n = (n + 1) % (piezas_height * piezas_width); } pos[n] = i; } //En el siguiente bloque cortamos las imagenes las asignamos en las posiciones aleatorias y las convertimos a algo que podemos manejas, //por último asignamos la imagen a un rectángulo del array de rectángulos. //Esta parte del código la sacamos de stackoverflow, tanto la parte de cortar las imagenes como la de transformarlas en algo que podemos mostrar. for (int i = 0; i < piezas_height * piezas_width; i++) { //Codigo para cortar las imagenes sacado y adaptado de: ///////////////////////////////////////////////////////////////////////////////////// //http://stackoverflow.com/questions/13625891/cut-an-image-into-9-pieces-c-sharp ///////////////////////////////////////////////////////////////////////////////////// imagenes[i] = new Bitmap(imagen.Size.Width / piezas_width, imagen.Size.Height / piezas_height); var gra = Graphics.FromImage(imagenes[i]); int ipos = i % piezas_width; int jpos = i / piezas_width; gra.DrawImage(imagen, new Rectangle(0, 0, imagen.Size.Width / piezas_width, imagen.Size.Height / piezas_height), new Rectangle(ipos * imagen.Size.Width / piezas_width, jpos * imagen.Size.Height / piezas_height, imagen.Size.Width / piezas_width, imagen.Size.Height / piezas_height), GraphicsUnit.Pixel); gra.Dispose(); //Código para transformar las imágenes a BitmapImage sacado de: ///////////////////////////////////////////////////////////////////////////////////// // http://joe-bq-wang.iteye.com/blog/1685024 ///////////////////////////////////////////////////////////////////////////////////// BitmapImage bi = new BitmapImage(); bi.BeginInit(); MemoryStream ms = new MemoryStream(); imagenes[i].Save(ms, ImageFormat.Bmp); ms.Seek(0, SeekOrigin.Begin); bi.StreamSource = ms; bi.EndInit(); //Asignamos a cada rectángulo la imagen transformada en la posición aleatoria. int i_rec = pos[i] % piezas_width; int j_rec = pos[i] / piezas_width; rect[i] = new RectImagen(i_rec * width / piezas_width, j_rec * height / piezas_height, width / piezas_width, height / piezas_height, bi); rect[i].setPosicionOld(rect[i].getPosicion()); } }