【发布时间】:2016-02-14 09:45:08
【问题描述】:
与朋友一起,我们正在尝试编写应用程序来处理 BMP 文件,并且我们将使其尽可能简单,因为我们才刚刚开始学习 C 和 C++。使用新的实际线条尺寸复制效果很好,但现在我想添加灰度效果并遇到另一个问题:图片的右侧向左移动 - 查看图片。是什么导致了这个问题?
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <unistd.h>
using namespace std;
void ReadBMP()
{
FILE* f = fopen("test2.bmp", "rb");
FILE* w = fopen("zapis.bmp", "wb");
if(f == NULL)
throw "Argument Exception";
unsigned char info[54];
fread(info, sizeof(unsigned char), 54, f);
fwrite(info, sizeof(unsigned char), 54, w);
int width = *(int*)&info[18];
int height = *(int*)&info[22];
cout << endl;
cout << "Width: " << width << endl;
cout << "Height: " << height << endl;
int realwidth = 3*width+(4 - ((3*width)%4))%4;
int volume = height * realwidth;
unsigned char* data = new unsigned char[volume];
fwrite(info, sizeof(unsigned char), 54, w);
fread(data, sizeof(unsigned char), volume, f);
unsigned char color = 0;
for(int i = 0; i < volume; i+=3)
{
color = 0;
color+=data[i]*0.114;
color+=data[i+1]*0.587;
color+=data[i+2]*0.299;
data[i] = color;
data[i+1] = color;
data[i+2] = color;
}
fwrite(data, sizeof(unsigned char), volume, w);
fclose(f);
fclose(w);
delete(data);
}
int main()
{
ReadBMP();
return 0;
}
【问题讨论】:
-
要写入二进制数据使用
write(),<<操作符会进行文本格式化,即使文件是以二进制模式打开的。 -
改成fwrite,还是有些问题
-
其实我的意思是
ofstream::write(),但是好吧... -
w.write(info, 54);错误:从 'unsigned char*' 到 'const char*' 的无效转换 [-fpermissive]|
-
如果你在 Windows 下运行它,你还需要指定“二进制”模式来写入输出文件:
fopen("zapis.bmp", "wb");。没有这个,每次你的程序尝试写入一个值为 0x0a 的八位字节时,文件中都会在它之前插入一个额外的 0x0d。