Esempio n. 1
0
        private void RenderImage()
        {
            Options o = GetOptions();

            try
            {
                tslInfo.Text = "";

                // Validate number of vertices per tile
                int k = o.VerticesPerTile & (o.VerticesPerTile - 1);
                if (k != 0)
                {
                    throw new Exception($"VerticesPerTile value { o.VerticesPerTile} must be a power of 2.");
                }

                // Validate number of vertices per tile

                if (o.VerticesPerTile < 8)
                {
                    throw new Exception($"VerticesPerTile value { o.VerticesPerTile} must be greater than or equal to 8.");
                }

                // load
                FIBITMAP dib = FreeImage.LoadEx(o.Filename);

                // calc resolution of tile
                int tileSizeResolution = o.VerticesPerTile - 1;

                // show tiles
                FREE_IMAGE_TYPE it  = FreeImage.GetImageType(dib);
                uint            bpp = FreeImage.GetBPP(dib);

                // Warn if bits-per-pixel is less than 16
                if (bpp != 16)
                {
                    tslInfo.Text = $"Warning! The image provided it's not 16 bits per pixel. 16 bpp grayscale image needed.";
                }

                // get height range
                var range = dib.GetHeightRange();

                // load image
                groupBox1.Text = $"{Path.GetFileName(o.Filename)}, {FreeImage.GetWidth(dib)}x{FreeImage.GetHeight(dib)}, {bpp} bpp, low: {range.X}, high: {range.Y}";

                // preview
                if (!o.SkipPreview)
                {
                    Image  i   = Image.FromFile(o.Filename);
                    Bitmap bmp = new Bitmap(i);

                    Graphics g     = Graphics.FromImage(bmp);
                    var      tiles = MathEx.GetTiles(bmp.Width, bmp.Height, tileSizeResolution);
                    foreach (var item in tiles)
                    {
                        g.DrawRectangle(Pens.LightGreen, item);
                    }

                    // show craters
                    // craterize
                    if (o.Craters > 0)
                    {
                        ce = new CraterEngine()
                        {
                            dib = dib, minRadius = o.CraterMinRadius, maxRadius = o.CraterMaxRadius, numCraters = o.Craters, seed = o.Seed
                        };
                        ce.BuildCraters();

                        foreach (var crater in ce.craters)
                        {
                            foreach (var item in crater.craterRidgePoints)
                            {
                                bmp.SetPixel((int)item.X, (int)item.Y, Color.Red);
                            }
                        }
                    }

                    // show image
                    pictureBox1.Image = bmp;
                }

                // free
                FreeImage.Unload(dib);
            }
            catch (Exception ex)
            {
                tslInfo.Text = ex.Message;
            }
        }