位图

位图(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 位位图是新手最容易踩坑的类型,重点注意:

  1. 调色板依赖:8 位位图的像素值(0-255)不是直接的颜色,而是指向bitmap.Palette中对应索引的颜色。比如值为 0 可能是黑色,值为 255 可能是白色(灰度图)。
  2. 默认调色板:创建 8 位位图时,系统会默认生成一个 256 色的灰度调色板(0 = 黑,255 = 白,中间是渐变灰度),你也可以自定义调色板实现彩色 8 位位图。
  3. 内存大小计算:总字节数 = Stride × Height(不是Width × Height)。
posted @ 2026-01-31 15:27  huihui不会写代码  阅读(2)  评论(0)    收藏  举报