private char getBestCharForSection(Bitmap section) { char ret = new char(); Bitmap quadrant = new Bitmap(section.Width / _horizResolution, section.Height / _vertResolution); Rectangle fullQuadrant = new Rectangle(0, 0, quadrant.Width, quadrant.Height); Graphics g = Graphics.FromImage(quadrant); byte[] sectionDarknessMap = new byte[_horizResolution * _vertResolution]; int d = 0; Debug.Write("Darkness map:"); for (int y = 0; y < _vertResolution; y++) { for (int x = 0; x < _horizResolution; x++) { Rectangle srcRect = new Rectangle((section.Width * x) / _horizResolution, (section.Height * y) / _vertResolution, quadrant.Width, quadrant.Height); g.FillRectangle(Brushes.White, fullQuadrant); g.DrawImage(section, fullQuadrant, srcRect, GraphicsUnit.Pixel); g.Flush(); sectionDarknessMap[d] = quadrant.GetDarkness(); Debug.Write(" " + sectionDarknessMap[d]); d++; } } Debug.WriteLine(""); Debug.Write("Closest character - '"); char leastWrong = ' '; int leastWrongness = int.MaxValue; foreach (var charDarknessMap in _characterDarknessMaps) { var thisWrongness = mapWrongness(sectionDarknessMap, charDarknessMap.Darknesses); if (thisWrongness < leastWrongness) { leastWrong = charDarknessMap.Character; leastWrongness = thisWrongness; } } ret = leastWrong; Debug.WriteLine(ret + "'"); return ret; }
private void generateCharacterDarknessMaps() { //TODO make this multithreaded var ret = new List<CharacterDarknessMap>(); Debug.WriteLine("Generating Character Darkness Maps"); //TODO figure out a better way to get the dimensions of this font Bitmap a = new Bitmap(1000, 1000); Graphics charG = Graphics.FromImage(a); Debug.WriteLine("Creating character buffer image..."); Bitmap charBuffer = new Bitmap((int)charG.MeasureString("M", _chosenFont).Width, (int)charG.MeasureString("M", _chosenFont).Height); Debug.WriteLine("Buffer image is " + charBuffer.Width + "x" + charBuffer.Height); Debug.WriteLine("Creating character quadrant buffer image..."); Bitmap charQuadBuffer = new Bitmap(charBuffer.Width / _horizResolution, charBuffer.Height / _vertResolution); Graphics quadG = Graphics.FromImage(charQuadBuffer); Debug.WriteLine("Character Quadrang buffer image is " + charQuadBuffer.Width + "x" + charQuadBuffer.Height); charG = Graphics.FromImage(charBuffer); charG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; charG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; charG.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; foreach (char iChar in _characterPool) { Debug.WriteLine("Analyzing '" + iChar + "'"); Debug.WriteLine("Painting '" + iChar + "' to buffer image..."); charG.FillRectangle(Brushes.White, 0, 0, charBuffer.Width, charBuffer.Height); charG.DrawString(iChar.ToString(), _chosenFont, Brushes.Black, 0, 0); charG.Flush(); CharacterDarknessMap dm = new CharacterDarknessMap { Character = iChar }; byte[] darknessMap = new byte[_vertResolution * _horizResolution]; int d = 0; for (int y = 0; y < _vertResolution; y++) { for (int x = 0; x < _horizResolution; x++) { Debug.WriteLine("Analyzing character quadrant " + x + "," + y); var destRect = new Rectangle(0, 0, charQuadBuffer.Width, charQuadBuffer.Height); var srcRect = new Rectangle((charBuffer.Width * x) / _horizResolution, (charBuffer.Height * y) / _vertResolution, charQuadBuffer.Width, charQuadBuffer.Height); quadG.DrawImage(charBuffer, destRect, srcRect, GraphicsUnit.Pixel); quadG.Flush(); byte quadrantDarkness = charQuadBuffer.GetDarkness(); Debug.WriteLine("Darkness: " + quadrantDarkness); darknessMap[d] = quadrantDarkness; d++; } } dm.Darknesses = darknessMap; ret.Add(dm); } Debug.WriteLine("Normalizing Character Darkness Maps"); byte highestOriginal = 0; foreach (var map in ret) { highestOriginal = Math.Max(map.Darknesses.Max(), highestOriginal); } Debug.WriteLine("Highest darkness was " + highestOriginal); decimal stretchFactor = ((decimal)255 / (decimal)highestOriginal); Debug.WriteLine("Stretching each value by a factor of " + stretchFactor); foreach (var map in ret) { Debug.Write("'" + map.Character + "' -"); for (int i = 0; i < map.Darknesses.Length; i++) { map.Darknesses[i] = (byte)(map.Darknesses[i] * stretchFactor); Debug.Write(" " + map.Darknesses[i].ToString("D3")); } Debug.WriteLine(""); } _characterDarknessMaps = ret; _charactersReady = true; }