BMP文件的读取显示
2009-08-12 11:05
260 查看
关于BMP文件格式的说明请参照网络资料,以下仅列出QNX下显示代码。
以上代码在QNX 6.4.1中测试通过。
/* * 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中测试通过。
相关文章推荐
- 读取SD卡里面的BMP文件 显示到TFT上
- 最简易的BMP文件格式读取和显示示意程序
- 单片机读取SD卡中BMP图片文件并送往TFT彩屏上显示(测试成功)(一)
- 读取BMP文件并显示出来(C++实现)
- BMP文件的读取与显示
- 读取SD卡里面的BMP文件 显示到TFT上
- 读取SD卡里面的BMP文件 显示到TFT上
- 利用COM组件IPicture读取jpg、gif、bmp图片文件数据和显示图片
- 【OPENGL】读取并显示BMP文件
- C语言读取和显示BMP文件
- BMP文件的读取与显示
- 读取BMP文件并显示出来(C++实现)
- 介绍一下MFC对话框工程读取BMP文件并显示的例子
- 单片机读取SD卡中BMP图片文件并送往TFT彩屏上显示(测试成功)(二)
- evc中BMP文件的读取与显示资料集
- Windows下BMP文件的读取及显示
- BMP文件的读取与显示
- 利用COM组件IPicture读取jpg、gif、bmp图片文件数据和显示图片的两个函数
- VC6.0中使用Stream Object读取数据中流文件并显示Bmp,JPG等图片
- VC6.0中使用Stream Object读取数据中流文件并显示Bmp,JPG等图片