如何显示一幅位图(位图的来龙去脉之一)

我们知道位图文件由文件头、信息头、调色板(不一定有)和实际位图数据构成。

这里我想说两个:一个就是调色板为什么还不一定有呢?二个就是组成位图的这四个结构在编程中是怎么表达的。

第一个问题:调色板为什么还不一定有呢?

我们知道(哈哈,这里我动不动就以这种为人师表的口吻说话了,纯属习惯,再就是提示一下基本知识)图像有灰度图,常用一串二进制数表示灰度图从最暗到最亮不同的级别,这个级别称为灰度级,每个级别的值称为灰度值。我们习惯说8位灰度值,意思是灰度级为256级,灰度值为0~255 。灰度值为0图像为黑色,灰度值为255,图像呈白色。除了灰度图外,还有彩色图,RGB是常用的颜色模型之一,RGB分别代表红色、绿色和蓝色。一般这几个颜色的级别也不一样,常见的有24位真彩色、16位色、256色,前两种说法(24位真彩色、16位色)用二进制位数表述,256色用颜色个数描述(256种颜色用8位二进制即可)。

 

有了上面的基础知识之后,我们来计算下位图的大小。位图由一个个像素组成,我们有两个约定:一、位图尺寸为640*480 ;二、颜色模型选择24位真彩色,这么说,一个像素占3Byte。大小=640*480*3Byte。好大啊。

到现在为止,我还没说到问题的核心:“调色板为什么不一定有呢?”哈哈,别急,我们增加一个约定,假设这幅位图虽然每个像素的颜色位数为24位,但是组成这幅图的颜色就只有16种(比如的话啊),即位图由16种不同颜色的像素点组成的(提示下:这里肯定有很多像素点是相同的,还像上面那样存储岂不是造成空间的极度浪费,明白了吗?不明白继续往下看,怎么使用所谓调色板来解决这种浪费),我们将这16种颜色放在一个表格里面,如下表:

Color1

Color2

Color3

Color4

Color5

Color6

Color7

Color8

Color9

Color10

Color11

Color12

Color13

Color14

Color15

Color16

在计算机里面,如果把这个表存起来需要的空间大小 = 16 * 3Byte 。没问题吧(16种颜色,每种颜色仍占3Byte嘛)。我们现在渐渐碰及问题的核心。现在位图像素矩阵中不在存放实际的颜色值,而是存放颜色的索引(也即颜色在表中的位置,16个颜色,4位二进制编码即可,4bit=0.5Byte)这样,位图的大小 = 640*480*0.5 + 16*3Bytes 是不是远远小于640*480*3Bytes

我想第一个问题就解释这么多。

第二个问题:组成位图的四个结构在程序中是如何表达的呢?

本例是想编写一个C的程序,显示一个计算机磁盘里面的位图,一个很自然的想法是先将位图通过一个read 函数从磁盘读到内存,然后在讲一些数据从内存送到显存(只有送到显存我们的眼睛才能看到,可以体会下什么叫内存绘图,呵呵)说的似乎很简单(真的,做起来的确蛮复杂的,特别是对我这些初学者来说,当然这些知识网上已经泛滥,你大可从网上下载现成的程序,如果你是高手,请帮我指出文章的错误)。

我不怕复杂。组成位图的前两个结构在C中是以结构体描述的,它们分别是:BITMAPFILEHEADERBITMAPINFOHEADER。因此一个位图在你脑子里面至少应该是这样的:

BITMAPFILEHEADER

BITMAPINFOHEADER

调色板

实际位图数据

第二个问题我草草结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值