现在出来的图片显示不正确,没法调试啊,代码如下:
#include <iostream>#include <fstream>
#include <cstring>
#include <windows.h>
using namespace std;
int main(){ BITMAPFILEHEADER bitHead;
BITMAPINFOHEADER bitInfoHead;
char PictureName[20]; fstream file;
cout << "请输入文件名称:" << endl;
cin >> PictureName;
file.open(PictureName,ios::in|ios::binary);
if (!file) {
cout << "文件不存在= =" << endl;
return 0;
}
cout << "文件打开成功!" << endl;
file.read((char *) &bitHead,sizeof(tagBITMAPFILEHEADER));//按字节方式读入文件头信息 file.read((char *) &bitInfoHead,sizeof(tagBITMAPINFOHEADER));//读入图像描述信息
LONG Width = bitInfoHead.biWidth;
LONG Height = bitInfoHead.biHeight;
int skipnum = 4 - ((Width * 3) % 4);//读文件时需要跳过的0的个数
RGBTRIPLE *p_bmp = new RGBTRIPLE[Width * Height];
for (LONG i = 0; i < Height; i++) {
file.read((char *) p_bmp,Width * 3);
file.seekg(skipnum,ios::cur);//跳过多余的0
}
file.close();
file.open("new.bmp",ios::in|ios::out|ios::binary|ios::app);//创建新的文件 if (!file) {
cout << "新文件创建失败= =" << endl;
return 0;
}
cout << "新文件创建成功!" << endl;
bitInfoHead.biHeight = Width;
bitInfoHead.biWidth = Height;//新生成的图像信息头
int addnum = 4 - ((Height * 3) % 4);
char *empty = new char[addnum];//用于写文件时补零
for (int i = 0; i < addnum; i++)
empty[i] = 0;
file.write((char *) &bitHead,sizeof(tagBITMAPFILEHEADER));
file.write((char *) &bitInfoHead,sizeof(tagBITMAPINFOHEADER));
for (LONG i = Width - 1; i >= 0; i--) {
for (LONG j = 0; j < Height; j++) {
file.write((char *) &p_bmp[Width * j + i],sizeof(tagRGBTRIPLE));
}
file.write(empty,addnum);//写完一行后补零
}
delete[] p_bmp; delete[] empty;
cout << "文件操作完成!" << endl;
file.close();
return 0;
}