标题是我的问题 - 如何翻转从文件中加载的std :: ifstream中的所有位?
ifstream file( "filename.png" );
if ( !file.is_open( ) ) {
return false;
}
我不知道自己应该如何离开这里。通过翻转,我指的是反转位(如果为1则为0,如果为0则为1)
答案 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