设为首页 加入收藏

TOP

图像编程学习笔记2――bmp位图平移 (三)
2014-11-23 19:09:44 来源: 作者: 【 】 浏览:51
Tags:图像 编程 学习 笔记 bmp 位图 平移
为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]
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇VC++获取屏幕大小第二篇 物理大小.. 下一篇VC++ 树的孩子兄弟表示法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: