CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

简单问题急问,大送分,请各位大侠帮小妹解答一下

楼主smallbird(灵灵)2003-11-03 19:39:30 在 C/C++ / C语言 提问

请问如何将bmp文件变成数组放到C文件中,不胜感激! 问题点数:0、回复次数:8Top

1 楼fwinfwin(彩虹沙漠随风飘飘)回复于 2003-11-03 19:45:38 得分 0

要转为什么样的数组阿?为什么要转数组呢?  
   
  或者你自己做一个函数来转这个数组,读取每一个点的rgb,然后写为asc形式的数组就可以了  
  Top

2 楼smallbird(灵灵)回复于 2003-11-03 19:52:21 得分 0

因为程序是要放在arm里面的,怎么读取每一点的数值?  
  我看到了人家转换好的,是一维数组,但是怎么转换的不知道  
  所以请教大家一下Top

3 楼bestfyj(笑俊)回复于 2003-11-03 21:37:34 得分 0

兩部份  
  第一個部份是記錄影像相關資料的檔頭  
  第二部份才是影像資料。  
  BMP   的檔頭可分為兩部份,第一部份在   WINDOWS.H   檔案中定義為BITMAPFILEHEADER   結構,其中前面兩個位元組固定為常數   0x4D42   (字串『BM』,表示這是一個   BMP   檔案,接下來的四個位元組為檔案大小,這也是我們在   MS-DOS   的   DIR   指令所看到的檔案大小,接下來的四個位元組保持為   0,第十一位元組開始的四個位元組記錄圖形資料起始位址,單色圖形通常為   0x3E,彩色圖形為   0x76。  
  第二部份資訊則由   BITMAPINFOHEADER   結構所定義,包括了十一個欄位,第一個欄位為常數   0X28,佔用四個位元組,第二與第三個欄位分別為長整數的圖形寬度與高度   (分別佔用四個位元組,以圖點為單位),第四個欄位為色平面數,通常為   1   (在十六色影像中為四),佔用兩個位元組,第五個欄位為每個圖點的顏色位元數,通常有   1、4、8、16、24、32   等值,為兩個位元組。  
  第六個至十一欄位都是四個位元組大小,首先為壓縮方式,若未壓縮則其值為   0,第七個欄位為實際圖形檔的位元組大小,第八與第九個欄位為每公尺水平與垂直解析度,第十個欄位為影像所使用的顏色數目,第十一個欄位則是重要的顏色數目。所以整個   BITMAPINFOHEADER   結構共佔用四十個位元組。  
   
  http://140.126.11.200/dalton/course/Ip/Handout/BMP.doc  
  我用google查到了这个网址  
  你下载一下吧  
  一目了然Top

4 楼smalltalk(老徐)回复于 2003-11-03 21:59:08 得分 0

/*=========   =======   ========   ===============================================*/  
  /*   97.11.02     2.0.0     XYL                 To   implement   this   file.                                             */  
  /****************************************************************************/  
   
  #include   <windows.h>           //   windows   API   definitions  
  #include   <stdlib.h>  
  #include   <stdio.h>  
  #include   "ncrc.h"             //   paint   application   resource   definitions  
  #include   "namecard.h"               //   paint   application   program   definitions  
   
  const   size_t   maxread     =   65534;   //   Read   65534   bytes   at   a   time  
  const   size_t   maxwrite   =   65534;   //   Write   65534   bytes   at   a   time  
   
  WORD   FAR   PASCAL   NumColors(LPBITMAPINFOHEADER   lphDib)  
  {  
      return   2^lphDib->biBitCount;  
  }  
   
  //int   FAR   PASCAL   NumColors(LPBITMAPINFOHEADER   lphDib);  
   
   
  /*********************************************************************  
        int   ReadBMPImage(TState   *lpState);  
        TRUE   if   successful,   FALSE   if   error  
      1.   Open   file,   if   failed,   return   FALSE.  
      2.   Read   file   header,   and   check   bitmap   file   signature.  
      3.   Get   the   file   size,   allocate   memory   for   DIB  
      4.   Setup   DIB   information.  
      5.   Read   pixel   data.  
      6.   Close   the   file  
  CALLED:  
      ReadImage  
  CALLING:  
      File   handling   routines  
      WriteBMPImage  
  ***********************************************************************/  
  HGLOBAL   FAR   PASCAL   ReadBMPImage(lpFilename)  
  LPSTR   lpFilename;  
  {  
        HFILE   hBmpFile;  
        BITMAPFILEHEADER   bmphdr;  
        char   huge   *   ImgInfo;  
        BITMAPINFOHEADER   FAR   *   lpbmpinfohdr;  
        long   bmpsize;  
        UINT   ReadLength;  
        HGLOBAL   hDib;  
  //   Open   file   for   reading,   if   failed,   return   FALSE.  
        hBmpFile   =   _lopen(lpFilename,   READ);  
   
        if   (hBmpFile   ==   HFILE_ERROR)  
              return   NULL;  
   
  //   Read   file   header,   and   check   bitmap   file   signature.  
        _lread(hBmpFile,   (unsigned   char*)&bmphdr,   sizeof(BITMAPFILEHEADER));  
   
        if   (bmphdr.bfType   !=   (('M'   <<   8)   |   'B'))  
              {  
                  _lclose(hBmpFile);  
                  return   NULL;              
              }      
   
  //   Get   the   file   size,   allocate   memory   for   DIB  
        bmpsize   =   bmphdr.bfSize   -   sizeof(BITMAPFILEHEADER);  
   
        hDib   =   GlobalAlloc(GHND,   bmpsize);  
   
  //   If   memory   allocation   fails,   return   0  
        if   (hDib   ==   0)  
              {  
                  _lclose(hBmpFile);  
                  return   NULL;              
                }    
   
  //   Load   the   file   in   big   chunks.   We   don't   have   to   interpret  
  //   because   our   internal   format   is   also   BMP.  
   
  //   Allocate   a   large   buffer   to   read   from   file  
        ImgInfo   =   (char   huge   *)   GlobalLock(hDib);  
   
        _lread(hBmpFile,   (unsigned   char   huge   *)ImgInfo,   sizeof(BITMAPINFOHEADER));  
        bmpsize   -=   sizeof(BITMAPINFOHEADER);  
        lpbmpinfohdr   =   (BITMAPINFOHEADER   FAR   *)ImgInfo;  
        (unsigned   char   huge   *)ImgInfo   +=   sizeof(BITMAPINFOHEADER);  
   
        _lread(hBmpFile,   (unsigned   char   huge   *)ImgInfo,    
                                                          NumColors(lpbmpinfohdr)   *   sizeof(RGBQUAD));  
        (unsigned   char   huge   *)ImgInfo   +=   NumColors(lpbmpinfohdr)   *   sizeof(RGBQUAD);  
        bmpsize   -=   NumColors(lpbmpinfohdr)   *   sizeof(RGBQUAD);  
        _llseek(hBmpFile,   bmphdr.bfOffBits,   0);    
   
        while   (   bmpsize   >   0   )  
        {  
              if   (   bmpsize   >   (long)maxread   )  
                    ReadLength   =   maxread;  
              else  
                    ReadLength   =   (UINT)bmpsize;  
              bmpsize   -=   ReadLength;  
   
              _lread(hBmpFile,   (unsigned   char   huge   *)ImgInfo,   ReadLength);  
              (unsigned   char   huge   *)ImgInfo   +=   ReadLength;  
        }  
        _lclose(hBmpFile);  
        GlobalUnlock(hDib);  
        return   hDib;  
   
  }  
   
  /*********************************************************************  
        int   WriteBMPImage(TState   *lpState);  
        TRUE   if   successful,   FALSE   if   error  
      1.   Create   the   file,   if   failed,   return   FALSE.  
      2.   Set   BMP   file   header,   and   write   this   header   to   file.  
      3.   Write   bitmap   data   to   file  
      4.   Close   the   file  
  CALLED:  
      WriteImage  
  CALLING:  
      File   handling   routines  
      ReadBMPImage  
  ***********************************************************************/  
  int   FAR   PASCAL   WriteBMPImage(lpFilename,   hDib)  
  LPSTR   lpFilename;  
  HGLOBAL   hDib;  
  {  
        HFILE   hBmpFile;  
        BITMAPFILEHEADER   bmphdr;  
        char   huge   *   ImgInfo;  
        long   bmpsize;  
        UINT   WriteLength;  
   
        if   (!hDib)  
              return   FALSE;  
   
  //   Open   file   for   binary   write   operations.  
        if   ((hBmpFile   =   _lcreat(lpFilename,   0))   ==   HFILE_ERROR)  
              return   FALSE;  
   
        ImgInfo   =   (char   huge   *)GlobalLock(hDib);  
   
  //   Set   up   BMP   file   header  
        bmphdr.bfType   =   ('M'   <<   8)   |   'B';  
        bmphdr.bfReserved1   =   0;  
        bmphdr.bfReserved2   =   0;  
        bmphdr.bfOffBits   =   sizeof(BITMAPFILEHEADER)   +  
                                              sizeof(BITMAPINFOHEADER)   +  
                                              NumColors((LPBITMAPINFOHEADER)ImgInfo)   *   sizeof(RGBQUAD);  
   
        bmphdr.bfSize   =   (long)((LPBITMAPINFO)ImgInfo)->bmiHeader.biSizeImage   +   bmphdr.bfOffBits;  
   
  //   Write   the   file   header   to   the   file  
        _lwrite(hBmpFile,   (unsigned   char   huge   *)&bmphdr,   sizeof(BITMAPFILEHEADER));  
   
        bmpsize   =   (long)sizeof(BITMAPINFOHEADER)   +  
                                            (long)NumColors((LPBITMAPINFOHEADER)ImgInfo)   *   (long)sizeof(RGBQUAD)   +  
                                            (long)((LPBITMAPINFO)ImgInfo)->bmiHeader.biSizeImage;  
   
        while   (   bmpsize   >   0   )  
        {  
              if   (   bmpsize   >   (long)maxwrite   )  
                    WriteLength   =   maxwrite;  
              else  
                    WriteLength   =   (UINT)bmpsize;  
              bmpsize   -=   (long)WriteLength;  
   
              _lwrite(hBmpFile,   (char   huge   *)ImgInfo,   WriteLength);  
              (char   huge   *)ImgInfo   +=   WriteLength;  
        }  
   
        GlobalUnlock(hDib);  
        _lclose(hBmpFile);  
        return   TRUE;  
  }  
  Top

5 楼smalltalk(老徐)回复于 2003-11-03 22:01:33 得分 0

上面是一个读写bmp图格式的文件完整实现,是我97年写的,那时还是Windows   3.1,用的是Visual   C++   1.5。哈哈,不过改进一下就应该可以在VC6中通过。Top

6 楼zjxiaoyu(alalei)回复于 2003-11-03 22:06:16 得分 0

hehe,这个我做过,碰巧也是为MMS(多媒体短信)做的,也是ARM要跑的。  
  不知你要做的仅仅是打开.bmp文件,整个放到内存里,还是需要解码?如果要解码不同格式的bmp(包括1,2,4,8,16,24位色的,而且包括解行程压缩编码)生成点阵信息的话,很麻烦。  
  难点:  
  1、内存受限系统的话,不能内存占用太多,光生成调色板就要占很大内存。  
  2、解码的时候要考虑4字节对齐。烦死。Top

7 楼dreamflying1980(梦想飞扬)回复于 2003-11-03 22:08:24 得分 0

up  
  Top

8 楼2608(爱编的程)回复于 2003-11-03 22:09:17 得分 0

upTop

相关问题

  • 又一个简单的问题,请高手帮小妹解答
  • 小妹疑问!请师哥们帮忙解答!简单继承问题!
  • 小妹请教一个怪异的问题!急盼大家解答
  • 简单的application高手赐教!小妹急啊,谢谢!
  • 小妹请教一下 linux的网卡 问题!望解答!
  • c语言的简单问题,急等解答。谢谢
  • 关于paint的简单问题,急等解答,谢谢
  • 急。。。。简单问题。解答马上给分!在线等。。。。。
  • 小妹妹紧急求助!
  • 帮帮小妹呀!!急呀

关键词

  • 内存
  • 影像
  • 文件
  • pascal
  • imginfo
  • bmpsize
  • writelength
  • hbmpfile
  • hdib
  • readlength

得分解答快速导航

  • 帖主:smallbird

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo