php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 366|回复: 0

C++语言BMP图像高度宽度和数据的读取

[复制链接]

3138

主题

3148

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
7946
贡献
0
注册时间
2021-4-14
最后登录
2024-11-21
在线时间
762 小时
QQ
发表于 2023-11-19 19:50:26 | 显示全部楼层 |阅读模式

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <iostream.h>
  4. #include <stdlib.h>

  5. void main()
  6. {
  7.         FILE *fid, *newraw,*newhead,*newbmp;
  8.         char *ph=new char[1078];
  9.     long int width;
  10.         long int height;
  11.         int a,b,c,d,m,n,i,j;
  12.        
  13. //打开lena_gray.bmp       
  14.         if((fid=fopen("LENA2.bmp","rb+"))==NULL)            
  15.         {
  16.                 cout<<"cannot open file\n"<<endl;
  17.                 exit(0);
  18.         }
  19.       
  20. //读取宽度和高度
  21.         fseek(fid,18,SEEK_SET);
  22.     fread(&width,sizeof(long),1,fid);
  23.     fread(&height,sizeof(long),1,fid);
  24.     cout<<"width="<<width<<endl;
  25.     cout<<"height="<<height<<endl;
  26.        
  27. //////////////////转化成表头和RAW文件/////////////////////////

  28. //新建head文件(用于记录文件头和调色板)
  29.         if((newhead=fopen("newhead","wb+"))==NULL)      
  30.     {
  31.         cout<<"cannot create newhead\n"<<endl;
  32.         exit(0);
  33.     }
  34. //新建lena_gray.raw       
  35.         if((newraw=fopen("lena_gray.raw","wb+"))==NULL)               
  36.         {
  37.                 cout<<"cannot create lena_gray.raw\n"<<endl;
  38.                 exit(0);
  39.         }
  40.         fseek(fid,0L,SEEK_SET);
  41.         fread(ph,1078,1,fid);                  
  42.         fwrite(ph,1078,1,newhead);
  43.     fclose(newhead);
  44. //对图像宽度进行处理:
  45.         if(width%4!=0)
  46.         {
  47.                 width=(width*8+31)/32*4;
  48.         }
  49. //申请二维数组的空间
  50.         char **p=new char*[height];
  51.         for(i=0;i<height;i++)
  52.                 p[i]=new char[width];
  53.         char **q=new char*[height];
  54.         for(j=0;j<height;j++)
  55.                 q[j]=new char[width];

  56.     fseek(fid,1078,SEEK_SET);

  57.         for(a=0;a<height;a++)
  58.         {
  59.                 for(b=0;b<width;b++)
  60.                 {
  61.                         fread(&p[a][b],sizeof(char),1,fid);
  62.                 }
  63.         }

  64. //坐标转换

  65.         for(m=0;m<height;m++)
  66.         {
  67.                 for(n=0;n<width;n++)
  68.                 {
  69.             q[m][n]=p[height-m-1][n];
  70.                 }
  71.          
  72.         }
  73.    
  74.         for(c=0;c<height;c++)
  75.         {
  76.                 for(d=0;d<width;d++)
  77.                 {
  78.                         fwrite(&q[c][d],sizeof(char),1,newraw);
  79.                 }
  80.         }

  81.        
  82.         fclose(newraw);
  83.         fclose(fid);

  84. ////////////////////////转化成BMP文件///////////////////
  85. //新建bmp文件       

  86.         if((newbmp=fopen("lena_nn.bmp","wb+"))==NULL)               
  87.     {
  88.         cout<<"cannot create file\n"<<endl;
  89.         exit(0);
  90.     }

  91. //打开newhead文件
  92.         if((newhead=fopen("newhead","rb+"))==NULL)      
  93.     {
  94.         cout<<"cannot open file\n"<<endl;
  95.         exit(0);
  96.     }
  97. //打开lena_gray.raw       
  98.         if((newraw=fopen("lena_gray.raw","rb+"))==NULL)               
  99.         {
  100.                 cout<<"cannot open file\n"<<endl;
  101.                 exit(0);
  102.         }
  103. //向lena_nn.bmp写入文件头
  104.         fread(ph,1078,1,newhead);
  105.         fwrite(ph,1078,1,newbmp);              
  106.                
  107.         for(a=0;a<height;a++)
  108.         {
  109.                 for(b=0;b<width;b++)
  110.                 {
  111.                         fread(&p[a][b],sizeof(char),1,newraw);
  112.                 }
  113.         }
  114. //转换坐标
  115.                   for(m=0;m<height;m++)
  116.         {
  117.                 for(n=0;n<width;n++)
  118.                 {
  119.            q[m][n]=p[height-m-1][n];
  120.                 }
  121.             
  122.         }

  123. //向lenan.bmp文件写入图像数据
  124.       
  125.         for(c=0;c<height;c++)
  126.         {
  127.                 for(d=0;d<width;d++)
  128.                 {
  129.                         fwrite(&q[c][d],sizeof(char),1,newbmp);
  130.                 }
  131.         }
  132.        
  133.     fclose(newbmp);
  134.     fclose(newraw);
  135.         fclose(newhead);
  136. //释放二维数组占用的空间
  137.         for(i=0;i<height;i++)
  138.                 delete(p[i]);
  139.         delete(p);

  140.         for(j=0;j<height;j++)
  141.                 delete(q[j]);
  142.         delete(q);

  143.    

  144. }
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-11-21 18:00 , Processed in 1.065198 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表