为rectWidth的数据到pTemp1,这里就是copy图像的一行数据
}
}
}
/**
* 函数名: writeBmp
* 功 能: 新建一个bmp文件,把平移后的图像信息写入,生成一个新的bmp
*/
void writeBmp()
{
char writeBmpName[] = "new.bmp";
FILE *fp = fopen(writeBmpName,"wb"); //以二进制写方式打开指定的图像文件
if(NULL == fp)
{
cout<<"file not exist!";
return ;
}
//写入BMP文件数据
fwrite(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp);
fwrite(&bmpInfoHeader,sizeof(BITMAPINFOHEADER),1,fp);
fwrite(pColorTable,sizeof(RGBQUAD),256,fp);
fwrite(pBmpData1,sizeof(char),imgSize,fp);
fclose(fp);
//释放内存
delete []pColorTable;
delete []pBmpData1;
delete []pBmpData;
}
/**
* 函数名: work
* 功 能: 处理
*/
void work()
{
int x,y;
char readBmpName[] = "nv1.bmp";
if ( !readBmp(readBmpName) )
printf("Bmp file reads faliure");
printf("the distance of translation,cx,cy:"); //读入平移的x和y
scanf("%d %d",&x,&y);
translation(x,y);
writeBmp();
}
int main()
{
work();
return 0;
}
/**
* 程序名: Translation.cpp
* 功 能: 实现bmp格式灰度图片的平移,移出部分用白色填充
*/
#include
#include
#include
#include
#include
using namespace std;
BITMAPFILEHEADER bmpFileHeader; //位图文件头
BITMAPINFOHEADER bmpInfoHeader;
//位图信息头
RGBQUAD *pColorTable = new RGBQUAD[256]; //颜色表指针
unsigned char *pBmpData; //图像数据指针
unsigned char *pBmpData1;
//平移后图像数据指针
unsigned char *pTemp,*pTemp1;
//临时指针
int width,height,imgSize; //图像宽,高,实际大小,imgSize必须为4的倍数,bmp格式文件结构规定
int srcX[2],srcY[2],dstX[2],dstY[2]; //平移前后位置
/**
* 函数名: readBmp
* 参 数: bmpFileName--指向读入bmp文件的文件名指针
* 功 能: 读入一个bmp文件,获得相应数据
*/
bool readBmp(char *bmpFileName)
{
FILE *fp = fopen(bmpFileName,"rb"); //以二进制读方式打开指定的图像文件
if(NULL == fp)
{
printf("%s is not exist!",bmpFileName);
return FALSE;
}
fread(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp); //读取位图头信息放入bmpFileHeader,注:指针也相应移动
fread(&bmpInfoHeader,sizeof(BITMAPINFOHEADER),1,fp); //读取位图信息头放入bmpInfoHeader
width = bmpInfoHeader.biWidth;
//宽
height = bmpInfoHeader.biHeight;
//高
fread(pColorTable,sizeof(RGBQUAD),256,fp);
//读取颜色表放入pColorTable
//
int bytePerLine = (bmpInfoHeader.biWidth * bmpInfoHeader.biBitCount + 31) / 32 * 4;
pBmpData = new unsigned char [imgSize = bmpInfoHeader.biSizeImage];
pBmpData1 = new unsigned char [imgSize];
memset(pBmpData1,(BYTE)255,sizeof(char)*imgSize);
//把新的图像信息用255(白色)填充,平移后没有图像的区域就是白色了
fread(pBmpData,sizeof(char),bmpInfoHeader.biSizeImage,fp);
//读取图像信息放入pBmpData
fclose(fp); //记住要关闭文件
return TRUE;
}
/**
* 函数名: translation
* 参 数: tx--平移的x距离,ty--平移的y距离
* 功 能: 实现平移,并把平移后图像信息写入pBmpData1
*/
void translation(int tx,int ty)
{
bool xVisible = TRUE,yVisible = TRUE;
//xVisible为FALSE时,表示x方向已经移出了可显示的范围
if(tx <= -width)
{
xVisible = FALSE;
}
else if(tx <= 0)
{
dstX[0] = 0;
//表示移动后,有图区域的左上角点的x坐标
dstX[1] = width + tx;
//表示移动后,有图区域的右下角点的x坐标
}
else if(tx < width)
{
dstX[0] = tx;
dstX[1] = width;
}
else
xVisible = FALSE;
srcX[0] = dstX[0] - tx;
//对应DstX0在原图中的x坐标
srcX[1] = dstX[1] - tx;
//对应DstX1在原图中的x坐标
int rectWidth = srcX[1]