using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using System.Drawing; namespace ImageArrayMaker { class Program { static void Main(string[] args) { WriteImage("Background", "whitebkgnd.png", "background.c"); WriteImage("Foreground", "redblueforegnd.png", "foreground.c"); WriteBitmask("Bitmask", "bitmask.png", "bitmask.c"); WriteImage("Results", "result.png", "result.c"); } static void WriteImage(string imgName, string imgFileName, string arrayFileName) { try { byte[] ir = File.ReadAllBytes(imgFileName); Image i = Image.FromStream(new MemoryStream(ir)); Bitmap bmp = new Bitmap(new Bitmap(i)); FileStream outFs = File.Create(arrayFileName); StreamWriter wr = new StreamWriter(outFs); wr.WriteLine("// {0} image width {1} and height {2} pixels", imgName, bmp.Width, bmp.Height); wr.WriteLine("// Each pixel consists of an Alpha, Red, Green and Blue byte, in that order."); wr.WriteLine("unsigned char {0}Image[] = {{", imgName.ToLower()); for (int row = 0; row < bmp.Height; row++) { if (row > 0) wr.WriteLine(); wr.Write(" "); for (int col = 0; col < bmp.Width; col++) { Color pixel = bmp.GetPixel(col, row); if (col > 0) wr.Write(","); wr.Write("0x{0},0x{1},0x{2},0x{3}", pixel.A.ToString("X2"), pixel.R.ToString("X2"), pixel.G.ToString("X2"), pixel.B.ToString("X2")); } } wr.WriteLine(); wr.WriteLine("};"); wr.Close(); outFs.Flush(); outFs.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } static void WriteBitmask(string imgName, string imgFileName, string arrayFileName) { try { byte[] ir = File.ReadAllBytes(imgFileName); Image i = Image.FromStream(new MemoryStream(ir)); Bitmap bmp = new Bitmap(new Bitmap(i)); FileStream outFs = File.Create(arrayFileName); StreamWriter wr = new StreamWriter(outFs); byte bits = 0; wr.WriteLine("// {0} mask width {1} and height {2} in bits", imgName, bmp.Width, bmp.Height); wr.WriteLine("// Each bit is set to 1 for masked or 0 for transparant."); wr.WriteLine("unsigned char {0}Bits[] = {{", imgName.ToLower()); for (int row = 0; row < bmp.Height; row++) { int bit = 0; bool firstByte = true; if (row > 0) wr.WriteLine(); wr.Write(" "); bits = 0; for (int col = 0; col < bmp.Width; col++) { Color pixel = bmp.GetPixel(col, row); if (pixel.A == 255) { bits = SetBit(bits, bit); } if((bit = NextBit(bit)) == 0) { if (!firstByte) wr.Write(","); wr.Write("0x{0}", bits.ToString("X2")); bits = 0; // Next byte firstByte = false; } } if (bit > 0) { if (!firstByte) wr.Write(","); wr.Write("0x{0}", bits.ToString("X2")); } } wr.WriteLine(); wr.WriteLine("};"); wr.Close(); outFs.Flush(); outFs.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } static byte SetBit(byte b, int bit) { return (byte)(b | (0x80 >> bit)); } static int NextBit(int bit) { if (bit < 7) return bit + 1; else return 0; } } }