//Decompress byte array into aBitmap with help of width, length and bitdepth public static AccessibleBitmapBitwise Decompress(BitStreamFIFO inBits, AccessibleBitmapBitwise inBitmap, out BitStreamFIFO restBits, int bitLayer) { //Read necessary info from BitStream bool currentVal = inBits.ReadBool(); Queue <int> runs = new Queue <int>(VaryingIntArrayCompressor.Decompress(ref inBits)); int pixelsToGo = runs.Dequeue() + 1; //Iterate trough all pixels for (int y = 0; y < inBitmap.height; y++) { for (int x = 0; x < inBitmap.width; x++) { //Set the bit of the current pixel to the value of the current run inBitmap.SetPixelBit(x, y, bitLayer, currentVal); //Decrease the length of the current run & check if the end has bin reached pixelsToGo--; if (pixelsToGo == 0 && (x * y != (inBitmap.height - 1) * (inBitmap.width - 1))) { //Read the new run length from the BitStream & reverse the run bit pixelsToGo = runs.Dequeue() + 1; //Toggle bit value currentVal = !currentVal; } } } //Return rest of bits & return bitmap restBits = inBits; return(inBitmap); }
//Decompress byte array into aBitmap with help of width, length and bitdepth public static AccessibleBitmapBitwise Decompress(BitStreamFIFO inBits, AccessibleBitmapBitwise inBitmap, out BitStreamFIFO restBits, int bitLayer) { //Decompress the incoming data to an array of integers int[] ints = VaryingIntArrayCompressor.Decompress(ref inBits); //Initialize int intIndex = 0; //The index in the array of intergers, from where the next integer should be taken bool[] tmpBools = new bool[8]; //The array of bits from which bits will be read to be applied to pixels int boolIndex = 8; //The index in the array of bits, from where the next bit should be taken //Add the data from the array of integers to the incoming bitmap //Loop trough all lines of pixels for (int y = 0; y < inBitmap.height; y++) { //Loop trough all pixels in this line for (int x = 0; x < inBitmap.width; x++) { //If index is 8, all bits are used, so tmpBools should be renewed by using the next integer in the array of integers if (boolIndex == 8) { //Reset the index to 0, so the next bit will be read from the start boolIndex = 0; //Convert the next integer in the array to a bool array, and write it to tmpBools tmpBools = new BitStreamFIFO().IntToBoolArray(ints[intIndex], 8); //Increase the index of the integer array, so the next integer will be read correctly intIndex++; } //Write the bit of this channel from the correct position in the array of bits to the current pixel inBitmap.SetPixelBit(x, y, bitLayer, tmpBools[boolIndex]); //Increase index for next bit boolIndex++; } } //Set the output BitStream to the remaining bits of the input BitStream restBits = inBits; //Return the modified AccessibleBitmapBitwise so the rest of the channels can be added to complete it return(inBitmap); }
//Decompress byte array into aBitmap with help of width, length and bitdepth public static AccessibleBitmapBitwise Decompress(BitStreamFIFO inBits, AccessibleBitmapBitwise inBitmap, out BitStreamFIFO restBits, int bitLayer) { //Read necessary info from BitStream bool currentVal = inBits.ReadBool(); //The bit value of the first run //Decompress the BitStream to a queue of integers Queue <int> runs = new Queue <int>(VaryingIntArrayCompressor.Decompress(ref inBits)); //Initialize int pixelsToGo = runs.Dequeue() + 1; //The amount of pixels that should be written before the next run starts //Loop trough all lines of pixels for (int y = 0; y < inBitmap.height; y++) { //Loop trough all pixels in this line for (int x = 0; x < inBitmap.width; x++) { //Set the bit of the current pixel to the value of the current run inBitmap.SetPixelBit(x, y, bitLayer, currentVal); //Decrease the length of the current run pixelsToGo--; //If the end of the run has been reached if (pixelsToGo == 0 && (x * y != (inBitmap.height - 1) * (inBitmap.width - 1))) { //Read the new run length from the BitStream pixelsToGo = runs.Dequeue() + 1; //Toggle bit value, because a bit can just have 2 values, and this run cannot have the same value as the previous run currentVal = !currentVal; } } } //Set the output BitStream to the remaining bits of the input BitStream restBits = inBits; //Return the modified AccessibleBitmapBitwise so the rest of the channels can be added to complete it return(inBitmap); }
//Decompress byte array into aBitmap with help of width, length and bitdepth public static AccessibleBitmapBitwise Decompress(BitStreamFIFO inBits, AccessibleBitmapBitwise inBitmap, out BitStreamFIFO restBits, int bitLayer) { //Add the data from this stream to the incoming bitmap //Loop trough all lines of pixels for (int y = 0; y < inBitmap.height; y++) { //Loop trough all pixels in this line for (int x = 0; x < inBitmap.width; x++) { //Write the bit of this channel from the input BitStream to the current pixel inBitmap.SetPixelBit(x, y, bitLayer, inBits.ReadBool()); } } //Set the output BitStream to the remainder of the input BitStream restBits = inBits; //Return the modified bitmap so the rest of the channels can be added to complete it return(inBitmap); }