24位bmp顺时针旋转90度C++代码求查错

现在出来的图片显示不正确,没法调试啊,代码如下:
#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;
}

第1个回答  2013-04-05
参考一下VC++数字图像处理类的书,下面是一个类似的,自己看看有什么帮助吗
/***********************************************************************
* 函数名称:
* Anticlockwise90()
*
*
*说明:对图像逆时针旋转90度
***********************************************************************/
void GeometryTrans::Anticlockwise90()
{
//释放旧的输出图像缓冲区
if(m_pImgDataOut!=NULL){
delete []m_pImgDataOut;
m_pImgDataOut=NULL;
}

//输入图像每行像素字节数 int lineByte=(m_imgWidth*m_nBitCount/8+3)/4*4;
//输出图像的宽和高
m_imgWidthOut=m_imgHeight;
m_imgHeightOut=m_imgWidth;

//输出图像每行像素字节数 int lineByteOut=(m_imgWidthOut*m_nBitCount/8+3)/4*4;
//申请缓冲区,存放输出结果 m_pImgDataOut=new unsigned char[lineByteOut*m_imgHeightOut];
//循环变量,图像坐标 int i,j;
//循环变量,像素的每个通道 int k;
//每像素字节数,输出图像与输入图像相等 int pixelByte=m_nBitCountOut/8;
//逆时针90度
for(i=0;i<m_imgHeightOut;i++){
for(j=0;j<m_imgWidthOut;j++){
for(k=0;k<pixelByte;k++)
*(m_pImgDataOut+i*lineByteOut+j*pixelByte+k)
=*(m_pImgData+(m_imgHeight-1-j)*lineByte+i*pixelByte+k);
}
}
}
第2个回答  2013-04-06
for (LONG i = 0; i < Height; i++) {
file.read((char *) p_bmp,Width * 3);//这里p_bmp不用偏移吗?
file.seekg(skipnum,ios::cur);//跳过多余的0
}本回答被提问者采纳