您的位置:首页 > 理论基础 > 计算机网络

BMP文件的读取显示

2009-08-12 11:05 260 查看
关于BMP文件格式的说明请参照网络资料,以下仅列出QNX下显示代码。

 

/*
* BMP.cpp
*
*  Created on: 2009-8-4
*      Author: wangsz
*/
/*
* 注意:
* 此处所能解析的bmp图像仅为垂直与水平分辨率都是96DPI的情况
*
*/

#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <photon/PhRender.h>
#include <Pt.h>
#pragma pack(1)
/*
* 文件头
*/
struct BITMAPFILEHEADER {
unsigned short bfType;
unsigned int bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned int bfOffBits;
};
/*
* 位图信息头
*/
struct BITMAPINFOHEADER {
unsigned int biSize;
long biWidth;
long biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned int biCompression;
unsigned int biSizeImage;
long biXPelsPerMeter;
long biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant;
};
/*
* 颜色表
* 颜色表中RGBQUAD结构数据的个数有biBitCount来确定:
* 当biBitCount=1,4,8时,分别有2,16,256个表项;
* 当biBitCount=24时,没有颜色表项。
*
*/
struct RGBQUAD {
unsigned char gbBlue; // 蓝色的亮度(值范围为0-255)
unsigned char gbGreen; // 绿色的亮度(值范围为0-255)
unsigned char gbRed; // 红色的亮度(值范围为0-255)
unsigned char gbReserved; // 保留,必须为0
};
/*
* 位图信息头和颜色表组成位图信息
*/

int DrawBMPFile(char* FileName) {
int fd;
unsigned char* pBuffer;
struct BITMAPFILEHEADER bfHeader;
struct BITMAPINFOHEADER bmInfoHeader;
struct RGBQUAD* pRGBQ;
int iRGBQLen;
int iImageWidth;
int iImageHeight;
int iBitsPerPixel;
int iDataSizePerLine;
int iImageDataSize;
int i;
int j;
unsigned char r;
unsigned char g;
unsigned char b;
unsigned char* pBitmapData;
unsigned char o;
unsigned char p;
//	unsigned char q;
unsigned char ucColorIdx;
struct RGBQUAD rgbColor;
// Open a file for input
fd = open(FileName, O_RDONLY);
// Load the file header
read(fd, &bfHeader, sizeof(bfHeader));
if (bfHeader.bfType != 0x4D42)
return EXIT_FAILURE;
//Load the image information header
read(fd, &bmInfoHeader, sizeof(bmInfoHeader));
iImageWidth = bmInfoHeader.biWidth;
iImageHeight = bmInfoHeader.biHeight;
iBitsPerPixel = bmInfoHeader.biBitCount;
iDataSizePerLine = (iImageWidth * iBitsPerPixel + 31) / 8; // 一个扫描行所占的字节数
iDataSizePerLine = iDataSizePerLine / 4 * 4;
iImageDataSize = iDataSizePerLine * iImageHeight;
pBuffer = calloc(iImageDataSize, sizeof(unsigned char));
// 先读取查色表数据
switch (iBitsPerPixel) {
case 1:
iRGBQLen = 2;
break;
case 4:
iRGBQLen = 16;
break;
case 8:
iRGBQLen = 256;
break;
default:
iRGBQLen = 0;
break;
}
pRGBQ = calloc(iRGBQLen, sizeof(struct RGBQUAD));
read(fd, pRGBQ, iRGBQLen * sizeof(struct RGBQUAD));
// 读取点阵信息
read(fd, pBuffer, iImageDataSize); // bmInfo.bmiHeader.biSizeImage);
// Close the file
close(fd);
/*
* 处理图像
* i代表行数
* j代表列数
*/
switch (iBitsPerPixel) {
case 1:
/*
* 单色位图,8个像素点占据1个字节
*/
for (i = 0; i < iImageHeight; i++) {
for (j = 0; j < iImageWidth; j++) {
pBitmapData = pBuffer + iDataSizePerLine * (iImageHeight - i
- 1) + iBitsPerPixel * j / 8;
o = 7 - (j % 8);
p = ((*pBitmapData) >> o) & 0x01;
if (p == 0x00) {
ucColorIdx = 0x00;
} else {
ucColorIdx = 0x01;
}
rgbColor = *(pRGBQ + ucColorIdx);
r = rgbColor.gbRed;
g = rgbColor.gbGreen;
b = rgbColor.gbBlue;
PgSetStrokeColor(PgARGB(0, r, g, b));
PgDrawIPixel(j, i);
}
}
break;
case 4:
/*
* 16色位图,2个像素点占据1个字节
*/
for (i = 0; i < iImageHeight; i++) {
for (j = 0; j < iImageWidth; j++) {
pBitmapData = pBuffer + iDataSizePerLine * (iImageHeight - i
- 1) + iBitsPerPixel * j / 8;
o = j % 2;  // (j + 1) / 2 - j / 2;
if (o == 0) {
ucColorIdx = ((*pBitmapData) >> 4) & 0x0f;
} else {
ucColorIdx = (*pBitmapData) & 0x0f;
}
rgbColor = *(pRGBQ + ucColorIdx);
r = rgbColor.gbRed;
g = rgbColor.gbGreen;
b = rgbColor.gbBlue;
PgSetStrokeColor(PgARGB(0, r, g, b));
PgDrawIPixel(j, i);
}
}
break;
case 8:
/*
* 256色位图,1个像素点占据1个字节
*/
for (i = 0; i < iImageHeight; i++) {
for (j = 0; j < iImageWidth; j++) {
pBitmapData = pBuffer + iDataSizePerLine * (iImageHeight - i
- 1) + iBitsPerPixel * j / 8;
ucColorIdx = (*pBitmapData);
rgbColor = *(pRGBQ + ucColorIdx);
r = rgbColor.gbRed;
g = rgbColor.gbGreen;
b = rgbColor.gbBlue;
PgSetStrokeColor(PgARGB(0, r, g, b));
PgDrawIPixel(j, i);
}
}
break;
case 24:
/*
* 24色真彩色位图,1个像素点占据3个字节
* 不用查色表
*/
for (i = 0; i < iImageHeight; i++) {
for (j = 0; j < iImageWidth; j++) {
/*
* 取一个点的像素值
* 基址+偏移量
* 其中偏移量是
*/
pBitmapData = pBuffer + iDataSizePerLine * (iImageHeight - i
- 1) + iBitsPerPixel * j / 8;
r = *(pBitmapData + 2);
g = *(pBitmapData + 1);
b = *(pBitmapData);
PgSetStrokeColor(PgARGB(0, r, g, b));
PgDrawIPixel(j, i);
}
}
break;
default:
break;
}

/*
* 释放内存
*/
free(pRGBQ);
free(pBuffer);
return EXIT_SUCCESS;
}


 

以上代码在QNX 6.4.1中测试通过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct file image 测试 网络