using Pgm; using System; using System.Collections.Generic; using System.IO; using System.Drawing; using System.Drawing.Imaging; namespace task_78 { public class Program { static void Main(string[] args) { Font inFont = readFont(Directory.GetCurrentDirectory() + "\\font.pgm"); if (inFont == null) return; writeFont(inFont, "font_print.bmp"); Console.ReadLine(); } static Font readFont(string path) { return new Font(PgmCreator.ReadPgmFile(path)); } /// /// Saves all Font.Char-Objects listed within the Font class into a new bmp file. /// /// /// static void writeFont(Font font, string path) { // create a new bmp with with equal dimensions to the font's data array. Bitmap bmp = new Bitmap(font.data.GetLength(0), font.data.GetLength(1)); // incrementor to not draw every character into the same spot. int shift = 0; // Iterate through all characters foreach (Font.Char c in font.chars) { for (int x = 0; x < c.w; x++) { for (int y = 0; y < c.h; y++) { // Print every single pixel of each character try { bmp.SetPixel(shift + x, y, Color.FromArgb(255, c.data[x, y], c.data[x, y], c.data[x, y])); } catch(Exception e) { Console.WriteLine(e.Message); } } } // Shift Char.Width pixels to the right + 1 Pixel for Seperation. shift += c.w + 1; } bmp.Save(path); Console.WriteLine("Bitmap saved!"); } } public class Font { public byte[,] data { get; private set; } public List chars { get; private set; } public Font(byte[,] data) { this.chars = new List(); this.data = data; this.getCharacters(); } /// /// attempts to read all characters stored in the data[,] information by splitting all characters using the grayscale value of '150' as given in the task. /// all readable characters will be stored in the chars-List /// private void getCharacters() { int i = 0, count = 0; // a new list, containing byte[]s to store the vertical row of pixels for each character List strip = new List(); // clear the character list, just in case this font was already written before. chars.Clear(); do { // Do we have a seperating greyscale code? if (data[i, 0] == 150 && i > 0) { // create a new 2 dimensional byte where we can temporarily write the character into byte[,] c = new byte[strip.Count, strip[0].Length]; for (int j = 0; j < strip.Count; j++) { for (int k = 0; k < strip[0].Length; k++) { c[j, k] = strip[j][k]; } } // increment the char counter count++; // add a new char struct to the list chars.Add(new Font.Char { key = "c_" + count, data = c, w = c.GetLength(0), h = c.GetLength(1) }); // clear the strip storage for the next character strip.Clear(); Console.WriteLine("Found Character " + count); } else { // if no seperating color code was detected, we add another byte[] to the strip list byte[] s = new byte[data.GetLength(1)]; for(int j = 0; j < s.Length; j++) { s[j] = data[i, j]; } strip.Add(s); } } while (i++ < data.GetLength(0) - 1); } public struct Char { public string key; public byte[,] data; public int w, h; } } }