问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

...将这个数组数据作为BMP位图的数据,怎么弄?有程序吗?

发布网友 发布时间:2024-10-08 01:43

我来回答

1个回答

热心网友 时间:2024-10-08 02:03

你需要了解BMP位图的文件格式:具体参阅百度百科: bmp 这个词条和MSDN。
我写了一个简单的创建24位BMP位图的小程序。 简单演示了bmp位图的格式。
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

#define BMP_W 640L
#define BMP_H 480L

void SetBmpInfoHeader(PBITMAPINFOHEADER pbmpih)
{
/* 14~17: 本结构体所占字节数, 固定值40 */
pbmpih->biSize = 40;
/* 18~21: 位图的宽度(以像素pixel为单位) */
pbmpih->biWidth = BMP_W;
/* 22~25: 位图的高度 */
pbmpih->biHeight = BMP_H;
/* 26~27: 目标设备的级别, 固定值:1 */
pbmpih->biPlanes = 1;
/* 28~29: 一个像素所占bit数, 可以是:1(双色)、4(16色)、8(256色)
、16(65536色)、24(真彩色2^24种颜色)、32(真彩色2^32种颜色),具体参阅MSDN。
对于24位真彩色位图, 一个像素占用三个字节,即24 bits */
pbmpih->biBitCount = 24;
/* 30~33:指定是否压缩, (如果压缩了)采用的压缩格式。
可以为: BI_RGB、BI_RLE4、BI_RLE8、BI_BITFIELDS、BI_PNG、BI_JPEG
有的位图会进行游程长度编码:BI_RLE4、BI_RLE8
压缩可以节省空间, 但不便于编程读写。BI_RGB表示不进行压缩处理 */
pbmpih->biCompression = BI_RGB;
/* 34~37: 位图数据区所占字节数,有固定的计算公式 */
pbmpih->biSizeImage = ((((pbmpih->biWidth * pbmpih->biBitCount) + 31) & ~31) / 8) * pbmpih->biHeight;
/* 38~41: 位图水平分辨率,每米像素数 */
pbmpih->biXPelsPerMeter = 0L;
/* 42~45: 位图垂直分辨率,每米像素数 */
pbmpih->biYPelsPerMeter = 0L;
/* 46~49: 位图实际使用颜色表中颜色数(对于有调色板的位图来说实际上是调色板中颜色项数,
24位真彩色位图不需要调色板, 设为0, 8位灰度位图为256(2^8种颜色)。 */
pbmpih->biClrUsed = 0L;
/* 50~53: 显示位图所需颜色数 */
pbmpih->biClrImportant = 0L;
}

void SetBmpFileHeader(PBITMAPFILEHEADER pbmpfh, const PBITMAPINFOHEADER pbmpih)
{
/* 0~1: 固定值: "BM"(或0x4D42),即表明这是位图(一般以bmp为文件名后缀)*/
pbmpfh->bfType = *(WORD *)"BM";
/* 2~5: 位图文件总大小(占用总字节数, 包括文件头、信息头、调色板、位图数据区占用字节数)*/
pbmpfh->bfSize = pbmpih->biSizeImage + 54 + pbmpih->biClrUsed * sizeof(RGBQUAD);
/* 6~7: 固定值0: 目前没什么用, 可能留作将来扩展。也有的结构体中有这样的域是为了内存对齐 */
pbmpfh->bfReserved1 = 0;
/* 8~9: 固定值 */
pbmpfh->bfReserved2 = 0;
/* 10~13: 位图数据区起始位置, 计算方法为:
位图文件头14个字节+位图信息头40个字节+位图调色板所占字节数,
这里要创建的是一张24位位图(无调色板),故设置为54 也可以。*/
pbmpfh->bfOffBits = 54 + pbmpih->biClrUsed * sizeof(RGBQUAD);
}

int main(void)
{
BITMAPFILEHEADER bmpfh = { 0 }; /* 位图文件头 */
BITMAPINFOHEADER bmpih = { 0 }; /* 位图信息头 */
FILE *fpBmp = NULL;
COLORREF color = RGB(0xf0,0xca,0xa6); /* 天蓝色 */
COLORREF black = 0;
int fillbits;
int w, h;

SetBmpInfoHeader(&bmpih);
SetBmpFileHeader(&bmpfh, &bmpih);
fillbits = ( 4 - ( bmpih.biWidth * 3 ) % 4 ) % 4;

fpBmp = fopen("D:\\rendering.bmp", "wb");
if (NULL == fpBmp) {
perror("fopen failed:");
system("pause>nul");
exit(EXIT_FAILURE);
}

fwrite(&bmpfh, sizeof(BITMAPFILEHEADER), 1, fpBmp); /* 写入位图文件头 */
fwrite(&bmpih, sizeof(BITMAPINFOHEADER), 1, fpBmp); /* 写入位图信息头 */
/* 写入调色板(如果有的话) */
/* 写入位图数据 */
for (h = 0; h < BMP_H; ++h) {
for (w = 0; w < BMP_W; ++w) {
fwrite(&color, 3, 1, fpBmp); /* 将像素值颜色写入位图文件 */
}
/* 边界填充
对于24位位图每个像素占3个字节,且每个扫描行所占字节数必须是4的倍数。
比如,对于一张宽度为21个像素的24色位图, 理论上每扫描行占用21*3=63个字节,
但63不是4的倍数,所以需要在该扫描行的最后填充一个字节的0,凑到64,
这样实际上每扫描行占用64个字节。
fillbits = ( 4 - ( biheader.biWidth * 3 ) % 4 ) % 4; 参考自acepig, 作用是
计算每扫描行需要填充几个字节的0。对于宽度是4的倍数的图片, count为0。
*/
fwrite(&black, 1, fillbits, fpBmp);
}
fclose(fpBmp);

system("mspaint D:\\rendering.bmp");
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...有还,换了另一个支付宝账号,以前的借呗的钱会不会被移动扣?_百度知 ... 哪些是主板型号 哪些是主板型号的 在北京工作三年了,由于平常压力比较大,一直掉头发,怎么改善啊?谢谢! 精神压力大是不是更容易掉发 日常如何预防脱发 我身体素质很差当兵会怎么样?我做俯卧撑只能做几个。 本人姓余,想中间取个博字后面加个什么字好听,男孩。五行缺木_百度... ...的男孩,五行缺木,爸爸姓马,妈妈姓孟,取名马博林可以吗 为什么我这两年变得不喜欢笑,就算觉得好笑也笑不出来了,以前是自己都会... 为什么有时候我会哭着哭着就会笑了没有人逗我笑是自然而然的笑 成年后你经历过哪些颠覆三观的事? 诽谤侮辱他人是否构成寻衅滋事罪? 被别人骂了法律怎么处理寻隙滋事 侮辱罪和寻衅滋事罪的界限是什么? 侮辱罪和寻衅滋事罪数罪并罚吗? 从高铁站下来到长江路总统府门口,应该怎么走? 乌鲁木齐准备坐高铁,在长江路坐几路车到高铁车站 孩子小时候尿床,长大了会好吗? 青春期的还有尿床习惯的男孩能出家吗?寺庙愿意收纳吗? 那些是重庆大学城重庆电子工程职业技术学院 (高职)的。帮我问问石光琴... 重庆大学城增家有没有黑网吧 重庆师范大学大学城校区的上网问题 有没有在重庆大学城上学的朋友? 天涯明月刀挖宝(萌新必读!介绍_天涯明月刀挖宝(萌新必读!是什么 卫生间 卫浴产品 洗脸盆 五金挂件 有哪些品牌值得信赖,性价比比较高... 天涯明月刀手游挖宝怎么挖 游侠挖宝技巧攻略 五年级第三课《走遍天下书为侣》后的小练笔,不能有一点抄。要说清理... 天涯明月刀挖宝(《天涯明月刀》游侠挖宝怎么玩介绍_天涯明月刀挖宝... 淘宝上买东鹏陶瓷可靠不? 孟建平试卷5年级上册走遍天下书为侣参考答案 为什么24位图,在加载时不需要创建调色板 BMP位图结构说明 欠有钱花不还会坐牢吗 五胡乱华谁救了汉人 不妨来看看 假如我是一朵荷花_作文 喝酸奶增肥吗,喝酸奶能增肥吗 睡觉时喝酸奶会增肥吗 避孕套是谁创造的 避孕套介绍 如何在正数前面加+号呢? ps提示没有显示图层是什么原因ps提示没有显示图层是什么原因造成的_百 ... ps没有图层匹配此过滤器怎么办没有图层匹配过此过滤器 涵的笔顺是什么? C语言结构体数组中元素的引用,指向结构体的指针和运算符的优先级和... C语言结构体指针和—&gt;的意思,以下语句从左往右什么意思啊 沈阳复读学校哪个可靠 2月22日提现30元现在未到账 HP 惠普 P6-1370CN 电脑时钟不准怎样处理?关机后第二天时钟好几个小时... 怎么区别犯罪预备与犯罪中止 高一历史.对战胜日本主要因素的看法 win10升级1607后累积更新无法安装怎么回事