程序总是出现debug assertion failed expression:str!=null这个错误
程序总是出现debug assertion failed expression:str!=null这个错误无法运行
程序如下,求解答。。。。。
#include "Windows.h"
#include<stdio.h>
#include<math.h>
const double Pi=3.1415926;
//---------------------------------------------------------------------
struct BMP
{
unsigned char *pData;
int Width;//图像的宽
int Height;//图像的高
int BitCount;
RGBQUAD *pColorTable;
};
//***********************************************************************
BMP ReadBMP(char *BmpName)
{
BMP FileRead;
//二进制读方式打开指定的图像文件
FILE *fp=fopen(BmpName,"rb");
if (fp==0)
{
FileRead.pData=NULL;
}
//跳过位图文件头结构BITMAPFILEHEADER
fseek(fp, sizeof(BITMAPFILEHEADER),0);
//定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中
BITMAPINFOHEADER head;
fread(&head, sizeof(BITMAPINFOHEADER), 1,fp);
//获取图像宽、高、每像素所占位数等信息
FileRead.Width = head.biWidth;
FileRead.Height = head.biHeight;
FileRead.BitCount = head.biBitCount;
//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
int lineByte=(FileRead.Width * FileRead.BitCount/8+3)/4*4;
//灰度图像有颜色表,且颜色表表项为256
if (FileRead.BitCount==8)
{//申请颜色表所需要的空间,读颜色表进内存
FileRead.pColorTable=new RGBQUAD[256];
fread(FileRead.pColorTable,sizeof(RGBQUAD),256,fp);
}
//申请位图数据所需要的空间,读位图数据进内存
FileRead.pData=new unsigned char[lineByte * FileRead.Height];
fread(FileRead.pData,1,lineByte *FileRead.Height,fp);
fclose(fp);
return FileRead;
}
/***********************************************************************
***********************************************************************/
bool SaveBMP(char *bmpName, BMP FileSave)
{ //如果位图数据指针为0,则没有数据传入,函数返回
if (!FileSave.pData)
return 0;
//颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0
int colorTablesize=0;
if (FileSave.BitCount==8)
colorTablesize=1024;
//待存储图像数据每行字节数为4的倍数
int lineByte=(FileSave.Width * FileSave.BitCount/8+3)/4*4;
//以二进制写的方式打开文件
FILE *fp=fopen(bmpName,"wb");
if (fp==0) return 0;
//申请位图文件头结构变量,填写文件头信息
BITMAPFILEHEADER fileHead;
fileHead.bfType = 0x4D42;//bmp类型
//bfSize是图像文件4个组成部分之和
fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + colorTablesize + lineByte*FileSave.Height;
fileHead.bfReserved1 = 0;
fileHead.bfReserved2 = 0;
//bfOffBits是图像文件前3个部分所需空间之和
fileHead.bfOffBits=54+colorTablesize;
//写文件头进文件
fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp);
//申请位图信息头结构变量,填写信息头信息
BITMAPINFOHEADER head;
head.biBitCount=FileSave.BitCount;
head.biClrImportant=0;
head.biClrUsed=0;
head.biCompression=0;
head.biHeight=FileSave.Height;
head.biPlanes=1;
head.biSize=40;
head.biSizeImage=lineByte*FileSave.Height;
head.biWidth=FileSave.Width;
head.biXPelsPerMeter=0;
head.biYPelsPerMeter=0;
//写位图信息头进内存
fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);
//如果灰度图像,有颜色表,写入文件
if (FileSave.BitCount==8)
fwrite(FileSave.pColorTable, sizeof(RGBQUAD),256, fp);
//写位图数据进文件
fwrite(FileSave.pData,FileSave.Height*lineByte, 1, fp);
//关闭文件
fclose(fp);
return 1;
}
/*************************************************************************
* 函数名称:* Rotate()
* 参数: * int angle - 旋转的角度(0-360度)
************************************************************************/
BMP RotateBMP(BMP BmpSrc, int angle)
{
BMP BmpDest;
LPRGBQUAD m_lpColorTable;
LPRGBQUAD m_lpColorTableOut;//输入、输出图像颜色表
int m_nColorTableLengthOut;
int m_nBitCountOut;//,m_nBitCount;
BmpDest.pData=NULL;//输出图像位图数据指针为空
BmpDest.BitCount=BmpSrc.BitCount;//输出图像每像素位数与输入图像相同
m_nColorTableLengthOut=0;
if (m_nColorTableLengthOut)
{
m_lpColorTableOut=new RGBQUAD[m_nColorTableLengthOut];
memcpy (m_lpColorTableOut, m_lpColorTable, sizeof(RGBQUAD)*m_nColorTableLengthOut);
}
else//彩色图像没有颜色表
m_lpColorTableOut=NULL;
int pixelByte = BmpSrc.BitCount/8;
int lineByte = (BmpSrc.Width*pixelByte+3)/4*4;
//---------------------------------------------------------------------------------------
float fRotateAngle = 2 * Pi * angle/360; // 旋转角度(弧度)
// 源图四个角的坐标(以图像中心为坐标系原点)
float fSrcX1,fSrcY1,fSrcX2,fSrcY2,fSrcX3,fSrcY3,fSrcX4,fSrcY4;
// 旋转后四个角的坐标(以图像中心为坐标系原点)
float fDstX1,fDstY1,fDstX2,fDstY2,fDstX3,fDstY3,fDstX4,fDstY4;
float fSina = (float) sin((double)fRotateAngle); // 计算旋转角度的正弦
float fCosa = (float) cos((double)fRotateAngle); // 计算旋转角度的余弦
// 计算原图的四个角的坐标(以图像中心为坐标系原点)
fSrcX1 = (float) (- (BmpSrc.Width - 1) / 2);
fSrcY1 = (float) ( (BmpSrc.Height - 1) / 2);
fSrcX2 = (float) ( (BmpSrc.Width - 1) / 2);
fSrcY2 = (float) ( (BmpSrc.Height - 1) / 2);
fSrcX3 = (float) (- (BmpSrc.Width - 1) / 2);
fSrcY3 = (float) (- (BmpSrc.Height - 1) / 2);
fSrcX4 = (float) ( (BmpSrc.Width - 1) / 2);
fSrcY4 = (float) (- (BmpSrc.Height - 1) / 2);
// 计算新图四个角的坐标(以图像中心为坐标系原点)
fDstX1 = fCosa * fSrcX1 + fSina * fSrcY1;
fDstY1 = -fSina * fSrcX1 + fCosa * fSrcY1;
fDstX2 = fCosa * fSrcX2 + fSina * fSrcY2;
fDstY2 = -fSina * fSrcX2 + fCosa * fSrcY2;
fDstX3 = fCosa * fSrcX3 + fSina * fSrcY3;
fDstY3 = -fSina * fSrcX3 + fCosa * fSrcY3;
fDstX4 = fCosa * fSrcX4 + fSina * fSrcY4;
fDstY4 = -fSina * fSrcX4 + fCosa * fSrcY4;
// 计算旋转后的图像宽度
BmpDest.Width = (LONG)(max(fabs(fDstX4 - fDstX1), fabs(fDstX3 - fDstX2)) + 0.5);
// 计算新图像每行的字节数
int lineByteOut = (BmpDest.Width * pixelByte+3)/4*4;
// 计算旋转后的图像高度
BmpDest.Height = (LONG)(max(fabs(fDstY4 - fDstY1), fabs(fDstY3 - fDstY2)) + 0.5);
BmpDest.pData=new unsigned char[lineByteOut*BmpDest.Height];
// 两个常数,这样不用以后每次都计算了
float f1 = (float) (-0.5 * (BmpDest.Width - 1) * fCosa - 0.5 * (BmpDest.Height - 1) * fSina
+ 0.5 * (BmpSrc.Width - 1));
float f2 = (float) ( 0.5 * (BmpDest.Width - 1) * fSina - 0.5 * (BmpDest.Height - 1) * fCosa
+ 0.5 * (BmpSrc.Height - 1));
//循环变量,输出图像坐标
int i,j;
//循环变量,像素的每个通道
int k=0;
int cX, cY;
unsigned char *pdest=NULL;
unsigned char *psrc=NULL;
//最近邻差值旋转
for (i = 0; i< BmpDest.Height; i++)
{
for (j = 0; j< BmpDest.Width; j++)
{
cX = (int)(j*fCosa+i*fSina+f1+0.5);
cY = (int)(-j*fSina+i*fCosa+f2+0.5);
psrc=BmpSrc.pData +cY*lineByte+cX*pixelByte+k;
pdest=BmpDest.pData+i*lineByteOut+j*pixelByte+k;
//判断是否在输入图像范围内
if ((cX >= 0)&&(cX < BmpSrc.Width)&&(cY >= 0)
&&(cY < BmpSrc.Height))
{
memcpy(pdest,psrc,4);
}
else
{
for (k=0; k<pixelByte; k++);
*(BmpDest.pData+i*lineByteOut+j*pixelByte+k) = 255;
*(BmpDest.pData+i*lineByteOut+j*pixelByte+k+1) = 255;
*(BmpDest.pData+i*lineByteOut+j*pixelByte+k+2) = 255;
}
}
}
return BmpDest;
}
//***********************************************************************
void main()
{//读入指定BMP文件进内存
char readPath[]="a.BMP";
BMP BmpIn=ReadBMP(readPath);
printf("请输入旋转角度: ");
int angle;
scanf("%d",&angle);
//旋转图像
BMP BmpOut=RotateBMP(BmpIn,angle);
//将图像数据存盘
char writePath[]="b.BMP";
SaveBMP(writePath,BmpOut);
}