Битовое расширение с конечной шириной (расширение изображений PBM) в C

Я пытаюсь расширить изображение PBM, скажем, с 5x5 до 10x10, но я столкнулся с некоторым препятствием.

Я прочитал заголовок и высоту / ширину со следующим

    int fSize = size(inFile);
    char *inputBuffer = malloc(fSize);


    int pbmHeight, pbmWidth;
    memset(inputBuffer, 0, fSize);

    if (!fgets(inputBuffer, sizeof(inputBuffer), inFile)) {
        fprintf(stderr, "Unable to read image format.\n");
        exit(-1);
    }

    if (inputBuffer[0] != 'P' || inputBuffer[1] != '4') {
        fprintf(stderr, "Invalid image format.\n");
        exit(-1);
    }

    if (fscanf(inFile, "%d %d", &pbmWidth, &pbmHeight) != 2) {
        fprintf(stderr, "Invalid image size.\n");
        exit(-1);
    }

    int i;
    int bitRemainder = ((pbmWidth % 8) != 0 ? 8 - (pbmWidth % 8) : 0);

Затем прочитайте данные

    while (fgetc(inFile) != '\n');
    fread(inputBuffer, pbmHeight * pbmWidth, 1, inFile);

У меня есть второй символ *secondPBM, который содержит другое изображение PBM такой же высоты / ширины

Что я хочу сделать, так это перебирать каждый бит 1-го изображения, 2-го изображения, сравнивать и затем выводить конкретные биты на выход

Например, вот изображение 1 (обратите внимание, что ширина изображения равна 5, но она должна заполнять 1 байт)

0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

Вот изображение 2

1 1 1 1 1 0 0 0
1 1 1 1 1 0 0 0
1 1 1 1 1 0 0 0
1 1 1 1 1 0 0 0
1 1 1 1 1 0 0 0

Основываясь на изображении 1 и изображении 2 бита, мне нужно вывести 4 бита, чтобы новый размер изображения стал 2 * pbmWidth

Так, например, выходные данные должны быть (изображение 10x10, с 6 битами, установленными в 0, чтобы заполнить оставшийся байт) (значения битов во 2-м изображении будут установлены с другим фрагментом кода и не совсем то, что указано в списке Вот)

1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0
0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0
1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0
0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0
1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0
0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0
1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0
0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0
1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0
0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0

Я читаю значение бита 1-го и 2-го изображения, как это

Вот мои функции getBitValue и setBitValue

int getBitVal(unsigned char *keyStrBin, int keyIndex) {

    int keyMod = keyIndex % 8;  
    int keyIn = keyIndex / 8;

return (((keyStrBin[keyIn]) >> (7 - (keyMod))) & 1);
}


void setBitVal(unsigned char *keyC, int keyIndex) {

    int keyMod = keyIndex % 8;  
    int keyIn = keyIndex / 8;
    keyC[keyIn] |= (1 << (7 - (keyMod)));
}


int newWidth = 2 * pbmWidth;
int newHeight = 2 * pbmHeight;
int totalBits = newWidth * newHeight;
int newFileSize = (totalBits % 8 == 0) ? (totalBits / 8) : (totalBits / 8 + 1);
int bitRemainder = ((pbmWidth % 8) != 0 ? 8 - (pbmWidth % 8) : 0);
int newbitRemainder = ((newWidth % 8) != 0 ? 8 - (newWidth % 8) : 0);

for (i = 0; k = 0; i < newHeight * (newWidth + newbitRemainder); i++, k++) {
    if (i != 0 && i % (pbmWidth - 1) == 0) {
        i += (bitRemainder - 1);
    }
    if (k != 0 && k % (newWidth - 1) == 0) {
        k += (newbitRemainder - 1);
    }
    if (getBitVal((unsigned char *)inputBuffer, i) == 0 && getBitVal(keyBuffer, k) == 0) {


    // Code to set 1 bit to black in the 1st row, then set another bit to black in the 2nd row. For example, The bit at index 0 becomes a 1, then the bit at index 17 becomes a 1 (Making a 2x2 square)
    // 1 0
    // 0 1
    // Then move on to the 2nd bit (or bit index 1) of the input image, compare.
    }

    else if (getBitVal((unsigned char *)inputBuffer, i) == 0 && getBitVal(keyBuffer, k) == 1) {

    }

    else if (getBitVal((unsigned char *)inputBuffer, i) == 1 && getBitVal(keyBuffer, k) == 0) {

    }

    else if (getBitVal((unsigned char *)inputBuffer, i) == 1 && getBitVal(keyBuffer, k) == 1) {

    }

Я не могу понять, как установить биты в сравнительных операторах if.

Я попробовал это, но это не похоже на работу.

setBitVal(pbmOut1Buffer, k * 2);
setBitVal(pbmOut1Buffer, (k * 2) + (newWidth + newbitRemainder) + 1);

Любая помощь с этим будет принята с благодарностью. Спасибо всем заранее.

0 ответов

Другие вопросы по тегам