Если изображение является .BMP, то каждая строка выравнивается по границе DWORD, поэтому по крайней мере начало каждой строки выравнивается по границе байта.
Чтобы отразить изображение, необходимо изменить порядок битов в каждом байте, а также изменить порядок байтов. Их можно легко комбинировать:
void rev_line(unsigned char* line, unsigned char* tmp_buff, int line_sz){
unsigned char* line2 = line + line_sz/8 - 1; // last complete byte of the input buffer
int bit_delta = line_sz % 8; // number of unaligned bits.
// special case for bit_delta == 0 :
if (!bit_delta){ // just reverse the input
while (line < line2){
unsigned char c = reverse(*line);
*line++ = reverse(*line2);
*line2-- = c;
};
if (line == line2) // odd number of bytes, so we'll just reverse it.
*line = reverse(*line);
return;
};
// now we have to take bit_delta bits from
for (; line2 >= line; line2--)
*tmp_buff++ = (reverse(line2[1]) >> (8 - bit_delta) | // not sure about endianness here!
(reverse(line2[0]) << bit_delta;
memcpy(line, tmp_buff, (line_sz + 7) / 8);
};
Это не оптимизировано, но объясняет идею. Обратите внимание, что вы должны быть очень хороши в сборке, чтобы иметь возможность побеждать компилятор C, так что измерьте!