public static BitPix FromString(string bitpixString) { if (string.IsNullOrEmpty(bitpixString)) { throw new ArgumentNullException(nameof(bitpixString)); } // no reason to go above 8 layers as it wouldnt really be suitable as a bitpix // 8 layers means 1 byte per pixel. (full grayscale) const int maximumSuitableLayers = 8; var widthHeight = (int)Math.Sqrt(bitpixString.Length); var layers = 1; var lowestValueNum = (byte)'0'; var highestValueNum = (byte)0; // 1. find highest value to determine the layer count // if the highest value is 0, then 1 layer is used. for (var i = 0; i < bitpixString.Length; i++) { var value = (byte)bitpixString[i]; if (value > highestValueNum) { highestValueNum = value; } } var highestValue = highestValueNum - lowestValueNum; for (var layer = 1; layer <= maximumSuitableLayers; layer++) { var lastCount = BitPixUtilities.NumberOfBitCombinations(layer - 1); var thisCount = BitPixUtilities.NumberOfBitCombinations(layer); if (highestValue >= lastCount && highestValue < thisCount) { layers = layer; break; } } // 2. loop through each char of the string and convert it to the number it is. var pix = BitPix.CreateEmpty(widthHeight, layers); for (var y = 0; y < widthHeight; y++) { for (var x = 0; x < widthHeight; x++) { var charValue = (byte)bitpixString[y * widthHeight + x]; var value = (byte)(charValue - lowestValueNum); pix.SetColorIndexAt(x, y, value); } } return(pix); }
public static BitPix FromBytes(int width, int height, int layers, byte[] data, int index = 0) { var pix = BitPix.CreateEmpty(width, height, layers); for (var i = 0; i < pix.Layers.GetLength(0); i++) { for (var j = 0; j < pix.Layers[i].Length; j++) { pix.Layers[i][j] = data[index++]; } } return(pix); }