C ++反转fstream中的所有位

时间:2015-02-06 19:29:58

标签: c++

标题是我的问题 - 如何翻转从文件中加载的std :: ifstream中的所有位?

ifstream file( "filename.png" );

if ( !file.is_open( ) ) {
    return false;
}

我不知道自己应该如何离开这里。通过翻转,我指的是反转位(如果为1则为0,如果为0则为1)

2 个答案:

答案 0 :(得分:2)

这是一个X-Y问题。我真的怀疑你想要翻转PNG格式文件中的所有位,只是因为除了位图位之外,文件中还有其他字段。此外,除非图像是纯黑色和&白色,颜色位比反转位更多。

那就是说,这是如何翻转的。

While not the end of the file, do:  
  read a block of bytes (uint8_t)  
  for each byte read do:  
     read the byte  
     invert the byte (a.k.a. using `~` operator)  
     store the byte  
  end-for  
  write block to new file.  
end-while  

反转像素的副作用
大多数图像由像素或图片元素组成。这些元素通常由每像素的多个位表示,如果是多种颜色,则每种颜色的位。

让我们举例说明每像素24位的RGB图像。这意味着有8位表示红色,8位表示绿色,8位表示蓝色。每种颜色的值范围为0到255.这表示颜色的数量。

让我们取1色,绿色,值为0x55或二进制0101 0101.反转(翻转)这些位将产生0xAA或1010 1010的值。因此,在翻转绿色值后现在为0xAA。

如果您想要发生这种情况,请更改每个像素的颜色数量,然后您需要从PNG文件中提取图像的颜色数量并将其反转。

答案 1 :(得分:1)

以下是一种方法:

#include <fstream>

int main(int argc, char **argv)
{
    std::ifstream ifile(argv[1]); /// input
    std::ofstream ofile(argv[2]); /// output

    if (ifile.is_open() && ofile.is_open()) {
        char ch;
        std::string data = "";

        while (ifile.get(ch)) {
            for (unsigned int i = 0; i < 8; ++i)
                ch ^= (1 << i);
            data += ch;
        }
        ofile << data;
    }
    ifile.close();
    ofile.close();
    return 0;
}

用法:

./prog input output

输入:

$ xxd -b input
0000000: 00110001 00110000 00110000 00110001 00001010

输出:

$ xxd -b output 
0000000: 11001110 11001111 11001111 11001110 11110101