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

 更新时间:2021年10月26日 09:32:35   作者:@leozhang  
这篇文章主要为大家详细介绍了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像素:

相关文章

  • 关于STL中vector容器的一些总结

    关于STL中vector容器的一些总结

    vector作为STL提供的标准容器之一,是经常要使用的,有很重要的地位,并且使用起来也是灰常方便。vector又被称为向量,vector可以形象的描述为长度可以动态改变的数组,功能和数组较为相似
    2013-09-09
  • C语言循环结构深入刨析

    C语言循环结构深入刨析

    C语言条件控制语句选择结构,是属于计算机的语言编辑,有在C语言条件控制中的语句选择结构的存在,即是C语言条件控制语句选择结构,循环控制语句是一个基于C语言的编程语句,该语句主要有while循环语句、do-while循环语句和for循环语句来实现循环结构
    2022-08-08
  • 深入分析C++模板特化与偏特化

    深入分析C++模板特化与偏特化

    这篇文章主要介绍了C++模板特化与偏特化的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-08-08
  • C++、C语言和JAVA开发的区别

    C++、C语言和JAVA开发的区别

    这篇文章主要给大家介绍了C++和C语言和JAVA开发的区别介绍,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-04-04
  • 基于C语言实现静态通讯录的示例代码

    基于C语言实现静态通讯录的示例代码

    这篇文章主要为大家详细介绍了如何利用C语言实现一个简单的静态通讯录,文中的示例代码讲解详细,对我们学习C语言有一定帮助,需要的可以参考一下
    2022-07-07
  • C++示例详解Prim算法与优先队列

    C++示例详解Prim算法与优先队列

    这篇文章介绍了C++ Prim算法、优先队列,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • visual studio 将编译后的dll等文件自动复制到指定目录的方法

    visual studio 将编译后的dll等文件自动复制到指定目录的方法

    这篇文章主要介绍了visual studio 将编译后的dll等文件自动复制到指定目录,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • C++解析obj模型文件方法介绍

    C++解析obj模型文件方法介绍

    由于本人打算使用Assimp来加载模型,这里记录一下tinyobjloader库的使用。之前也研究过fbxsdk,除了骨骼动画暂未读取外,代码自认为还算可靠
    2022-09-09
  • C++回溯算法深度优先搜索举例分析

    C++回溯算法深度优先搜索举例分析

    回溯在迷宫搜索中使用很常见,就是这条路走不通,然后返回前一个路口,继续下一条路。回溯算法说白了就是穷举法,下面让我们一起来看看回溯算法深度优先搜索吧
    2022-03-03
  • C++实现LeetCode(105.由先序和中序遍历建立二叉树)

    C++实现LeetCode(105.由先序和中序遍历建立二叉树)

    这篇文章主要介绍了C++实现LeetCode(105.由先序和中序遍历建立二叉树),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07

最新评论