using System.Collections;
public class ImageConverterTest
private static void Main()
Console.WriteLine("Begin...");
Console.WriteLine("Success!");
private static byte[] ConvertRasterToColumnFormat(byte[] rasterData, int width, int height)
var finalHeight = height;
while (finalHeight % 8 != 0) finalHeight++;
while (finalWidth % 8 != 0) finalWidth++;
var rasterBitArray = new BitArray(rasterData);
var columnBitArray = new BitArray(finalHeight * finalWidth);
for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++)
var rasterPosition = y * finalWidth;
var columnPosition = x * finalHeight;
rasterPosition += (x / 8) * 8;
columnPosition += (y / 8) * 8;
rasterPosition += 7 - x % 8;
columnPosition += 7 - y % 8;
var value = rasterBitArray[rasterPosition];
columnBitArray[columnPosition] = value;
var result = new byte[columnBitArray.Length / 8];
columnBitArray.CopyTo(result, 0);
public static void ConvertTest0()
byte[] rasterData = new byte[]
var result = ConvertRasterToColumnFormat(rasterData, 8, 1);
byte[] expected = new byte[]
AssertSequenceEquals(rasterData, expected, result);
public static void ConvertTest1()
byte[] rasterData = new byte[]
var result = ConvertRasterToColumnFormat(rasterData, 8, 3);
byte[] expected = new byte[]
AssertSequenceEquals(rasterData, expected, result);
public static void ConvertTest2()
byte[] rasterData = new byte[]
var result = ConvertRasterToColumnFormat(rasterData, 7, 3);
byte[] expected = new byte[]
AssertSequenceEquals(rasterData, expected, result);
public static void ConvertTest3()
byte[] rasterData = new byte[]
var result = ConvertRasterToColumnFormat(rasterData, 1, 8);
byte[] expected = new byte[]
AssertSequenceEquals(rasterData, expected, result);
public static void ConvertTest4()
byte[] rasterData = new byte[]
var result = ConvertRasterToColumnFormat(rasterData, 9, 1);
byte[] expected = new byte[]
AssertSequenceEquals(rasterData, expected, result);
public static void ConvertTest5()
byte[] rasterData = new byte[]
var result = ConvertRasterToColumnFormat(rasterData, 13, 1);
byte[] expected = new byte[]
AssertSequenceEquals(rasterData, expected, result);
public static void ConvertTest6()
byte[] rasterData = new byte[]
0b1000_0000, 0b1000_0000,
0b1000_0000, 0b1000_0000,
0b1000_0000, 0b1000_0000,
0b1000_0000, 0b1000_0000,
var result = ConvertRasterToColumnFormat(rasterData, 9, 4);
byte[] expected = new byte[]
AssertSequenceEquals(rasterData, expected, result);
public static void ConvertTest7()
byte[] rasterData = new byte[]
var result = ConvertRasterToColumnFormat(rasterData, 8, 9);
byte[] expected = new byte[]
0b0000_0000, 0b0000_0000,
0b0000_0000, 0b0000_0000,
0b0000_0000, 0b0000_0000,
0b0000_0000, 0b0000_0000,
0b0000_0000, 0b1000_0000,
0b0000_0000, 0b0000_0000,
0b0000_0000, 0b0000_0000,
AssertSequenceEquals(rasterData, expected, result);
public static void ConvertTest8()
byte[] rasterData = new byte[]
0b1000_0000, 0b0000_0000,
0b0100_0000, 0b0000_0000,
0b0010_0000, 0b0000_0000,
0b0001_0000, 0b0000_0000,
0b0000_1000, 0b0000_0000,
0b0000_0100, 0b0000_0000,
0b0000_0010, 0b0000_0000,
0b0000_0001, 0b0000_0000,
0b0000_0000, 0b1000_0000,
0b0000_0000, 0b0100_0000,
0b0000_0000, 0b0010_0000,
0b0000_0000, 0b0001_0000,
0b0000_0000, 0b0000_1000,
0b0000_0000, 0b0000_0100,
0b0000_0000, 0b0000_0010,
0b0000_0000, 0b0000_0001,
var result = ConvertRasterToColumnFormat(rasterData, 16, 16);
byte[] expected = new byte[]
0b1000_0000, 0b0000_0000,
0b0100_0000, 0b0000_0000,
0b0010_0000, 0b0000_0000,
0b0001_0000, 0b0000_0000,
0b0000_1000, 0b0000_0000,
0b0000_0100, 0b0000_0000,
0b0000_0010, 0b0000_0000,
0b0000_0001, 0b0000_0000,
0b0000_0000, 0b1000_0000,
0b0000_0000, 0b0100_0000,
0b0000_0000, 0b0010_0000,
0b0000_0000, 0b0001_0000,
0b0000_0000, 0b0000_1000,
0b0000_0000, 0b0000_0100,
0b0000_0000, 0b0000_0010,
AssertSequenceEquals(rasterData, expected, result);
private static void AssertSequenceEquals(byte[] original, byte[] expected, byte[] actual)
Assert.True(actual.SequenceEqual(expected),
$"Original:{Environment.NewLine}" +
$"{string.Join(Environment.NewLine, original.Select((b, i) => $"[{i}] {System.Convert.ToString(b, 2).PadLeft(8, '0')}"))}" +
$"{Environment.NewLine}{Environment.NewLine}" +
$"Expected:{Environment.NewLine}" +
$"{string.Join(Environment.NewLine, expected.Select((b, i) => $"[{i}] {System.Convert.ToString(b, 2).PadLeft(8, '0')}"))}" +
$"{Environment.NewLine}{Environment.NewLine}" +
$"Actual:{Environment.NewLine}" +
$"{string.Join(Environment.NewLine, actual.Select((b, i) => $"[{i}] {System.Convert.ToString(b, 2).PadLeft(8, '0')}"))}" +
$"{Environment.NewLine}");