Запуск алгоритма RLE приводит к отсутствию данных на BMP - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь внедрить алгоритм RLE в мою программу сжатия. В настоящее время у меня есть изображение, которое квантуется, а затем передается в функцию runLengthEncode. Функции RLE внизу работали для меня на строковых данных при вызове их по

std::ifstream inputFile(inputFile, std::ios_base::binary);

и

std::ofstream outputFile(outputFileName + "_RLEcompressed." + savedExtension, std::ios_base::binary);

, но, похоже, не работает при передаче произвольных данных. Должен ли я вместо этого запускать кодирование RLE на char *? Позволит ли это сделать данные более произвольными? Я также проверил на других изображениях, которые не были квантованы ранее, поэтому я знаю, что проблема все еще преобладает.

Функции RLE:

/*
* Run Length Encoding
* This function uses the RLE algorithm to encode/compress data
*/
void runLengthEncode(std::istream &is, std::ostream &os){    
    char ch; //Buffering character
    char prev_ch; //Holds previous characters
    int count = 1; //Counts number of chars in a run
    is.get(prev_ch); //Get first char of input stream
    while (is.get(ch)) {
        if(ch != prev_ch) { //Character has changed from a run
            os << count << prev_ch;
            count = 0; //Reset          
        }
        count++;
        prev_ch = ch; //Set prev_ch to char just read
    } os << count << prev_ch; //Reads last character to output
}

/*
* Run Length Decoding
* This function uses the RLE algorithm to decode/decompress data
*/
void runLengthDecode(std::istream &is, std::ostream &os){
    char ch; //Buffering character
    while (is.get(ch)) {
        int numToPrint = ch - '0'; //Gets number of char
        is.get(ch); //Gets character to print
        while(numToPrint--){
            os << ch;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...