设为首页 加入收藏

TOP

BMP图像旋转----C++实现
2014-11-23 20:00:40 来源: 作者: 【 】 浏览:5
Tags:BMP 图像 旋转 ----C 实现

如果前面几个实验都做过了的,做这个应该很简单,今天也是看到图像相关的文章,所以也就复习了一遍,以前也就是知道原理,没编过,这次就都完成了吧。。下面我做的是一个BMP图像旋转的实验。(我选的是180,相对来说比较简单)。

我的代码:

 #include  
#include   
 
using namespace std; 
 
 
void main() 
{ 
     
    FILE* stream=fopen("D:\\3.bmp","rb"); 
    if(stream==NULL) 
    { 
        cout<<"文件不存在"<biWidth*24)+31)/32)*4; 
    fseek(stream,sizeFileHeader+sizeInfoHeader,0); 
 
    //读取图像数据  
    int count=srcImageLineByteCount-bitmapInfoHeader->biWidth*(bitmapInfoHeader->biBitCount/8); 
    BYTE* tempData=new BYTE[count]; 
    BYTE*** oldImageData=new BYTE**[bitmapInfoHeader->biHeight]; 
    for(int i=0;ibiHeight;i++) 
    { 
        oldImageData[i]=new BYTE*[bitmapInfoHeader->biWidth]; 
        for (int j=0;jbiWidth;j++) 
        { 
            oldImageData[i][j]=new BYTE[3]; 
            for(int k=0;k<3;k++) 
            { 
                fread(&oldImageData[i][j][k],sizeof(BYTE),1,stream); 
            } 
        } 
         
        for(int m=0;mbiHeight]; 
     
    for(int i=0;ibiHeight;i++) 
    { 
        newImageData[i]=new BYTE*[bitmapInfoHeader->biWidth]; 
        for (int j=0;jbiWidth;j++) 
        { 
            newImageData[i][j]=new BYTE[3]; 
            for (int k=0;k<3;k++) 
            { 
                newImageData[i][j][k]=oldImageData[bitmapInfoHeader->biHeight-i-1][bitmapInfoHeader->biWidth-j-1][k]; 
            } 
        } 
         
    } 
 
 
    //写数据  
    FILE* fileWrite=fopen("D:\\7.bmp","a+"); 
    fwrite(bitmapFileHeader,sizeof(char),sizeof(BITMAPFILEHEADER),fileWrite); 
    fwrite(bitmapInfoHeader,sizeof(char),sizeof(BITMAPINFOHEADER),fileWrite); 
    for(int i=0;ibiHeight;i++) 
    { 
        for(int j=0;jbiWidth;j++) 
        { 
            for(int k=0;k<3;k++) 
            { 
                fwrite(&newImageData[i][j][k],sizeof(BYTE),1,fileWrite); 
            } 
             
        } 
        for (int s=0;s
#include 

using namespace std;


void main()
{
 
 FILE* stream=fopen("D:\\3.bmp","rb");
 if(stream==NULL)
 {
  cout<<"文件不存在"<biWidth*24)+31)/32)*4;
 fseek(stream,sizeFileHeader+sizeInfoHeader,0);

 //读取图像数据
 int count=srcImageLineByteCount-bitmapInfoHeader->biWidth*(bitmapInfoHeader->biBitCount/8);
 BYTE* tempData=new BYTE[count];
 BYTE*** oldImageData=new BYTE**[bitmapInfoHeader->biHeight];
 for(int i=0;ibiHeight;i++)
 {
  oldImageData[i]=new BYTE*[bitmapInfoHeader->biWidth];
  for (int j=0;jbiWidth;j++)
  {
   oldImageData[i][j]=new BYTE[3];
   for(int k=0;k<3;k++)
   {
    fread(&oldImageData[i][j][k],sizeof(BYTE),1,stream);
   }
  }
  
  for(int m=0;mbiHeight];
 
 for(int i=0;ibiHeight;i++)
 {
  newImageData[i]=new BYTE*[bitmapInfoHeader->biWidth];
  for (int j=0;jbiWidth;j++)
  {
   newImageData[i][j]=new BYTE[3];
   for (int k=0;k<3;k++)
   {
    newImageData[i][j][k]=oldImageData[bitmapInfoHeader->biHeight-i-1][bitmapInfoHeader->biWidth-j-1][k];
   }
  }
  
 }


 //写数据
 FILE* fileWrite=fopen("D:\\7.bmp","a+");
 fwrite(bitmapFileHeader,sizeof(char),sizeof(BITMAPFILEHEADER),fileWrite);
 fwrite(bitmapInfoHeader,sizeof(char),sizeof(BITMAPINFOHEADER),fileWrite);
 for(int i=0;ibiHeight;i++)
 {
  for(int j=0;jbiWidth;j++)
  {
   for(int k=0;k<3;k++)
   {
    fwrite(&newImageData[i][j][k],sizeof(BYTE),1,fileWrite);
   }
   
  }
  for (int s=0;s 
 

代码分析:其实这里有个很关键的问题:那就是内存对齐的那段内存,我们在读取数据的时候,必须把它删除,但是在我们向文件里写数据的时候,我们必须把它给补上,因为那些补齐的内存数据就是00 00 00所以我就用了一个数组把它存起来(其实在读取文件的时候,我是通过读取的方式填充这个数组,而不是直接给它赋值,大家从代码中可以看出来。。我在这里只是强调一下)。

int count=srcImageLineByteCount-bitmapInfoHeader->biWidth*(bitmapInfoHeader->biBitCount/8);
BYTE* tempData=new BYTE[count];


这里的count是指那段补齐的内存字节多少,这里我测试的是3,(我的宽度是407,24位)。

不懂为什么这样写的参看前面几章的内容,也可以留言。。

再说一下我保存数据的那个三维指针(也不知道是不是这样称呼的,暂且这样说吧,大家都懂的。。)

BYTE*** oldImageData=new BYTE**[bitmapInfoHeader->biHeight];


BYTE*** newImageData=new BYTE**[bitmapInfoHeader->biHeight];


我的思路是:所有的数据=高度*宽度*像素所占字节数。我的是:407*360*3。我逐行遍历,再逐像素(像素间)遍历,然后在像素的内部遍历。

好了,这个程序就OK了。。。睡觉。。。悲剧的一天,全部花在了各种蛋疼的调试。

我的效果:

原图:

\

旋转后的图:

\

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇uva 1291 - Dance Dance Revoluti.. 下一篇BMP图像的灰度化---C++实现

评论

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

·Python爬虫教程(从 (2025-12-26 16:49:14)
·【全269集】B站最详 (2025-12-26 16:49:11)
·Python爬虫详解:原 (2025-12-26 16:49:09)
·Spring Boot Java: (2025-12-26 16:20:19)
·Spring BootでHello (2025-12-26 16:20:15)