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; } }