diff --git a/PgmCreatorDemo.cs b/PgmCreatorDemo.cs deleted file mode 100644 index 990b4fb..0000000 --- a/PgmCreatorDemo.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using System.IO; -using System.Diagnostics; -using Pgm; - -class PgmCreatorDemo { - - //TYPICAL USAGE OF THE PGMCREATOR CLASS: - static void MakeLenaBlackWhite() { - // for the specification of PGM-Files, see: http://netpbm.sourceforge.net/doc/pgm.html - - // A byte-array is used for storing the gray-color-values. - // The img has the size 256x256 pixel; - // Each pixel has a gray-color-value from 0-255 (0...black, 255...white). - // Note also that the FIRST dimension (row-index) corresponds - // to the x-Coordinate (!!!) in the image, the second dimension (col-index) - // to the y-coordinate (!!!). The y coordinate goes from up to down! - // Thus, an index of [50, 250] is at the left and bottom of the image. - // (The Write/ReadPGM-Methods internally transpose the matrix.) - - // Open Lena, make it black-white (threshold is the value 128), and save it: - try { - byte[,] lenaImgData = PgmCreator.ReadPgmFile("lena.pgm"); - for (int x = 0; x < lenaImgData.GetLength(0); x++) { - for (int y = 0; y < lenaImgData.GetLength(1); y++) { - if (lenaImgData[x, y] < 128) lenaImgData[x, y] = 0; - else lenaImgData[x, y] = 255; - } - } - PgmCreator.WritePgmFile("lena_black_white.pgm", lenaImgData, PgmType.P5); - Console.WriteLine("Success making Lena black-white!"); - } - catch (FileNotFoundException e) { - Console.WriteLine("Where ist the file? " + e.Message); - } - catch (FormatException e) { - Console.WriteLine("Wrong file format: " + e.Message); - } - catch (Exception e) { - Console.WriteLine(e.Message); - } - } - - static void Main(string[] args) { - TestBinaryAndASCIIFormat(); - MakeLenaBlackWhite(); - } - - //Helper Method which produces a byte-array representing a gradient image: - private static byte[,] ProduceGradientImage() { - byte[,] imgData = new byte[256, 256]; - - // fill the imgData-Array with the gray-color-values: - for (int y = 0; y < imgData.GetLength(1); y++) { - for (int x = 0; x < imgData.GetLength(0); x++) { - // produce a gray-color gradient image: - // top-left corner: black, bottom-right corner: white. - // Note that x and y go from 0 to 255, so x/2 + y/2 cannot exceed the value 254. - imgData[x, y] = (byte)(x / 2 + y / 2); - } - } - return imgData; - } - - //Tests whether both pgm file formats work: - private static void TestBinaryAndASCIIFormat() { - byte[,] imgData = ProduceGradientImage(); - - byte[,] readDataAscii; - byte[,] readDataBinary; - try { - // write imgData to P2 file (ascii): - PgmCreator.WritePgmFile("testASCII.pgm", imgData, PgmType.P2); - // read from P2 file (ascii): - readDataAscii = PgmCreator.ReadPgmFile("testASCII.pgm"); - // write image data to P5 file (binary): - PgmCreator.WritePgmFile("testBinary.pgm", readDataAscii, PgmType.P5); - // read P5 file (binary): - readDataBinary = PgmCreator.ReadPgmFile("testBinary.pgm"); - - //check if the image loaded from the P2-type file (ascii) - //is the same as from the P5-type file (binary): - for (int y = 0; y < imgData.GetLength(1); y++) { - for (int x = 0; x < imgData.GetLength(0); x++) { - Debug.Assert(readDataAscii[x,y] == readDataBinary[x,y]); - } - } - Console.WriteLine("Success in testing two generated files of both types!"); - } catch (Exception e) { - Console.WriteLine(e.Message); - } - } -} diff --git a/Program.cs b/Program.cs index 20cb8d1..06a8bd0 100644 --- a/Program.cs +++ b/Program.cs @@ -1,14 +1,111 @@ -using System; +using Pgm; +using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.IO; +using System.Drawing; +using System.Drawing.Imaging; namespace task_78 { - class Program + 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; } } } diff --git a/task_78.csproj b/task_78.csproj index ffb349e..112dccf 100644 --- a/task_78.csproj +++ b/task_78.csproj @@ -35,6 +35,7 @@ + @@ -43,11 +44,16 @@ + + + + Always +