Пример #1
0
        /// <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());
            }
        }
Пример #2
0
        /// <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());
            }
        }