C语言实现bmp图像的平移操作

平移变换是一种几何变换。平移的公式为:x1=x0+t,y1=y0+t,其中(x0,y0)是原图像中的坐标,(x1,y1)是经过平移变换后的对应点的坐标。
在编程中,先将处理后图像的所有区域赋值为白色,然后找出平移后显示区域的左上角点(x0,y0)和右下角点(x1,y1),分以下几种情况处理:
先看x方向(width为图像的宽度)
(1)t<=-width,图像向左移动,此时图像完全移除了显示区域,所以不做任何处理;
(2)-width<t<=0,图像向左移动,图像区域的x范围为0~width-|t|,对用于原图像的范围为|t|~width;
  (3)0<t<width,图像右移,图像的x范围是t~width,对应于原图的范围是0~width-t;

  (4)t>=width,图像向右移动且完全移出了显示区域,因此不做处理。


上下平移的方法与左右移动相同。

左右平移C语言代码如下:

// left_right_translation.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<windows.h>
#include<stdio.h>
#include<math.h>

int _tmain(int argc, _TCHAR* argv[])
{
	int width;
	int height;
	RGBQUAD *pTableColor;
	unsigned char *pBmpBuf1,*pBmpBuf2;

	BITMAPFILEHEADER bfhead;
	BITMAPINFOHEADER bihead;
	
	//读出源图像的信息
	FILE *fpr=fopen("E:\\picture\\dog.bmp","rb");
	if(fpr==0)
		return 0;
	fread(&bfhead,14,1,fpr);
	fread(&bihead,40,1,fpr);
	width=bihead.biWidth;
	height=bihead.biHeight;
	int LineByte=(width*8/8+3)/4*4;
	pTableColor=new RGBQUAD[256];
	fread(pTableColor,sizeof(RGBQUAD),256,fpr);
	pBmpBuf1=new unsigned char[LineByte*height];
	fread(pBmpBuf1,LineByte*height,1,fpr);
	fclose(fpr);
	//将处理后的图像赋值为白色
	pBmpBuf2=new unsigned char[LineByte*height];
	for(int i=0;i<height;i++)
		for(int j=0;j<width;j++)
		{
			unsigned char *p;
			p=(unsigned char*)(pBmpBuf2+LineByte*i+j);
			(*p)=255;
		}

		//左右平移功能的实现
	int t;
	printf("请输入左平移或右平移的大小t(左移t<0,右移t>0):");
	scanf("%d",&t);
	int k=abs(t);
	printf("%d",k);
	if(t<0)
	{
		if(t>=(-width))
		{
			for(int i=0;i<height;i++)
				for(int j=0;j<(width-k);j++)
			{
				unsigned char *p1,*p2;
				p1=pBmpBuf1+LineByte*i+j+k;
				p2=pBmpBuf2+LineByte*i+j;
				(*p2)=(*p1);
			}
		}
	}
	else 
	{
		if(t<=width)
		{

			for(int i=0;i<height;i++)
				for(int j=k;j<width;j++)
				{
					unsigned char *p1,*p2;
					p1=pBmpBuf1+LineByte*i+j-k;
					p2=pBmpBuf2+LineByte*i+j;
					(*p2)=(*p1);
				}

		}

	}
	//保存处理后的图像
	FILE *fpw=fopen("dog.bmp","wb");
	fwrite(&bfhead,14,1,fpw);
	fwrite(&bihead,40,1,fpw);
	fwrite(pTableColor,sizeof(RGBQUAD),256,fpw);
	fwrite(pBmpBuf2,LineByte*height,1,fpw);
	fclose(fpw);


	
	return 0;
}

原图:


向左平移100个像素后图像:


向右移动200像素:


  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值