简单问题急问,大送分,请各位大侠帮小妹解答一下
请问如何将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




