位图
位图(Bitmap)核心概念解析
位图(也叫光栅图)是最常见的数字图像表示方式,核心思想是用像素(Pixel)矩阵来描述图像—— 每一个像素都有自己的颜色值,整个图像就是无数个像素点的集合。
可以用一个简单的比喻理解:位图就像十字绣,画布上的每一个格子(像素)都对应一个颜色,格子越密(分辨率越高),图像越清晰,但占用的存储空间也越大。
位图的关键属性
1. 像素格式(PixelFormat)
这是位图最核心的属性,决定了每个像素用多少字节存储颜色信息,也是你上一轮代码中Format8bppIndexed的核心:
| 像素格式 | 含义 | 特点 | 适用场景 |
|---|---|---|---|
Format8bppIndexed |
8 位索引位图 | 每个像素占 1 字节(0-255),值是调色板(Palette)的索引,不是直接的颜色值 | 灰度图、简单色彩的图像(如图标、灰度扫描件),占用空间小 |
Format24bppRgb |
24 位真彩色 | 每个像素占 3 字节,分别存储 R/G/B(红 / 绿 / 蓝)各 8 位,无透明度 | 普通彩色照片、高清图像 |
Format32bppArgb |
32 位真彩色 | 每个像素占 4 字节,包含 A(透明度)+R+G+B 各 8 位 | 带透明通道的图像(如 UI 素材) |
2. 扫描行(Stride)
你上一轮代码中提到的Stride(也叫步幅)是位图内存布局的关键:
- 定义:位图中一行像素占用的总字节数(不是 “宽度 × 每个像素字节数”)。
- 原因:Windows 系统为了内存访问效率,要求每行字节数是 4 的整数倍,不足时会填充空字节。
- 举例:8 位位图宽度为 10 像素(理论每行 10 字节),但 Stride 会是 12(填充 2 字节);宽度为 12 像素时,Stride=12(刚好 4 的倍数)。
3. 锁定 / 解锁(LockBits/UnlockBits)
- 为什么需要:直接通过
bitmap.GetPixel(x,y)访问像素会频繁调用 API,效率极低;LockBits会把位图数据一次性锁定到连续的内存块,返回内存指针(Scan0),可以直接通过内存操作(如拷贝、修改)处理像素,效率提升几十倍。 - 必须配对:
LockBits后必须调用UnlockBits,否则会导致内存泄漏、位图对象损坏。
8 位索引位图的特殊说明(你代码的核心)
8 位位图是新手最容易踩坑的类型,重点注意:
- 调色板依赖:8 位位图的像素值(0-255)不是直接的颜色,而是指向
bitmap.Palette中对应索引的颜色。比如值为 0 可能是黑色,值为 255 可能是白色(灰度图)。 - 默认调色板:创建 8 位位图时,系统会默认生成一个 256 色的灰度调色板(0 = 黑,255 = 白,中间是渐变灰度),你也可以自定义调色板实现彩色 8 位位图。
- 内存大小计算:总字节数 =
Stride × Height(不是Width × Height)。


浙公网安备 33010602011771号