##BMP图片的平移
#include <stdio.h>
#include <windows.h>
#include <iostream>
using namespace std;
unsigned int Height = 0;
unsigned int Width = 0;
int main()
{
BITMAPFILEHEADER bmpfileheader; //文件头
BITMAPINFOHEADER bmpinfoheader; //信息头
BYTE *bmp;//象素矩阵
BYTE *bmp_X;//象素矩阵
BYTE *bmp_Y;//象素矩阵
FILE *fpin; //读取操作流
FILE *fpout_X; //读出操作流
FILE *fpout_Y; //读出操作流
fpin=fopen("picture.bmp","rb");
fread(&bmpfileheader,sizeof(BITMAPFILEHEADER),1,fpin);//读取文件头
fread(&bmpinfoheader,sizeof(BITMAPINFOHEADER),1,fpin);//读取信息头
Height=bmpinfoheader.biHeight;
Width=bmpinfoheader.biWidth;
bmp = (BYTE*)malloc(Height*Width*3);
bmp_X = (BYTE*)malloc(Height*Width*3);
bmp_Y = (BYTE*)malloc(Height*Width*3);
fread(bmp,1,Height*Width*3,fpin);//读取象素矩阵
fclose(fpin);
int i=0;//定义循环变量
int j=0;//定义循环变量
int k=0;//定义循环变量
//平移前将图像处理为黑色
for(i=0;i<Height*Width*3;i+=3)
{
*(bmp_X+i)=255;
*(bmp_X+i+1)=255;
*(bmp_X+i+2)=255;
*(bmp_Y+i)=255;
*(bmp_Y+i+1)=255;
*(bmp_Y+i+2)=255;
}
int x;//定义x轴平平移参数
int y;//定义y轴平平移参数
//输入水平变量
while(1)
{
cout<<"请输入x轴平移的参数(正数向右,负数向左,范围为-512至+512):";
cin>>x;
if(-512<x&&x<512)
break;
else
{
cout<<"水平参数超出范围,请重新输入"<<endl;
}
}
//输入竖直变量
while(1)
{
cout<<"请输入y轴平移的参数(正数向上,负数向下,范围为-512至+512):";
cin>>y;
if(-512<y&&y<512)
break;
else
{
cout<<"竖直参数超出范围,请重新输入"<<endl;
}
}
//水平处理图片
if(x>=0)
{
for(k=0;k<Height;k++)
{
for(i=x*3+Width*3*k,j=Width*3*k;i<Width*3*(k+1),j<(k+1)*Width*3-x*3;i+=3,j+=3)
{
*(bmp_X+i)=*(bmp+j);
*(bmp_X+i+1)=*(bmp+j+1);
*(bmp_X+i+2)=*(bmp+j+2);
}
}
}
if(x<0)
{
x=-x;
for(k=0;k<Height;k++)
{
for(i=x*3+Width*3*k,j=Width*3*k;i<Width*3*(k+1),j<(k+1)*Width*3-x*3;i+=3,j+=3)
{
*(bmp_X+j)=*(bmp+i);
*(bmp_X+j+1)=*(bmp+i+1);
*(bmp_X+j+2)=*(bmp+i+2);
}
}
}
i=0;//初始化循环变量
j=0;//初始化循环变量
k=0;//初始化循环变量
//垂直处理图片
if(y>=0)
{
for(k=0;k<Height-y;k++)
{
for(i=k*Width*3,j=(y+k)*Width*3;i<(Height-y)*Width*3,j<Height*Width*3;i+=3,j+=3)
{
*(bmp_Y+j)=*(bmp_X+i);
*(bmp_Y+j+1)=*(bmp_X+i+1);
*(bmp_Y+j+2)=*(bmp_X+i+2);
}
}
}
if(y<0)
{
y=-y;
for(k=0;k<Height-y;k++)
{
for(i=k*Width*3,j=(y+k)*Width*3;i<(Height-y)*Width*3,j<Height*Width*3;i+=3,j+=3)
{
*(bmp_Y+i)=*(bmp_X+j);
*(bmp_Y+i+1)=*(bmp_X+j+1);
*(bmp_Y+i+2)=*(bmp_X+j+2);
}
}
}
//打开图片
fpout_Y=fopen("picture_XY.bmp","wb");
//将信息写入文件
fwrite(&bmpfileheader,sizeof(BITMAPFILEHEADER),1,fpout_Y);
fwrite(&bmpinfoheader,sizeof(BITMAPINFOHEADER),1,fpout_Y);
fwrite(bmp_Y,1,Height*Width*3,fpout_Y);
fclose(fpout_Y);
cout<<"平移后图像输出成功"<<endl;
return 0;
}