位图Bitmap

2023-11-09

 

位图图像(bitmap), 亦称为点阵图像或绘制图像,是由称作像素(图片元素)的单个点组成的。这些点可以进行不同的排列和染色以构成图样。当放大位图时,可以看见赖以构成整个图像的无数单个方块。扩大位图尺寸的效果是增大单个像素,从而使线条和形状显得参差不齐。然而,如果从稍远的位置观看它,位图图像的颜色和形状又显得是连续的。

 

概要

在体检时,工作人员会给你一个本子,在这个本子上有一些图像,而图像都是由一个个的点组成的,这和位图图像其实是差不多的。由于每一个像素都是单独染色的,您可以通过以每次一个像素的频率操作选择区域而产生近似相片的逼真效果,诸如加深阴影和加重颜色。缩小位图尺寸也会使原图变形,因为此举是通过减少像素来使整个图像变小的。同样,由于位图图像是以排列的像素集合体形式创建的,所以不能单独操作(如移动)局部位图。一般情况下,位图是工具拍摄后得到的。如数码相机拍摄的照片.

 

位图重点

处理位图时要着重考虑分辨率

处理位图时,输出图像的质量决定于处理过程开始时设置的分辨率高低。分辨率是一个笼统的术语,它指一个图像文件中包含的细节和信息的大小,以及输入、输出、或显示设备能够产生的细节程度。操作位图时,分辨率既会影响最后输出的质量也会影响文件的大小。处理位图需要三思而后行,因为给图像选择的分辨率通常在整个过程中都伴随着文件。无论是在一个300 dpi的打印机还是在一个2570dpi的照排设备上印刷位图文件,文件总是以创建图像时所设的分辨率大小印刷,除非打印机的分辨率低于图像的分辨率。如果希望最终输出看起来和屏幕上显示的一样,那么在开始工作前,就需要了解图像的分辨率和不同设备分辨率之间的关系。显然矢量图就不必考虑这么多。

位图颜色编码

  RGB

  位图颜色的一种编码方法,用红、绿、蓝三原色的光学强度来表示一种颜色。这是最常见的位图编码方法,可以直接用于屏幕显示。

  CMYK

  位图颜色的一种编码方法,用青、品红、黄、黑四种颜料含量来表示一种颜色。常用的位图编码方法之一,可以直接用于彩色印刷。

编辑本段位图图像属性

索引颜色/颜色表

  位图常用的一种压缩方法。从位图图片中选择最有代表性的若干种颜色(通常不超过256种)编制成颜色表,然后将图片中原有颜色用颜色表的索引来表示。这样原图片可以被大幅度有损压缩。适合于压缩网页图形等颜色数较少的图形,不适合压缩照片等色彩丰富的图形。

  Alpha通道

  在原有的图片编码方法基础上,增加像素的透明度信息。图形处理中,通常把RGB三种颜色信息称为红通道、绿通道和蓝通道,相应的把透明度称为Alpha通道。多数使用颜色表的位图格式都支持Alpha通道。

  色彩深度

  色彩深度又叫色彩位数,即位图中要用多少个二进制位来表示每个点的颜色,是分辨率的一个重要指标。常用有1位(单色),2位(4色,CGA),4位(16色,VGA),8位(256色),16位(增强色),24位和32位(真彩色等。色深16位以上的位图还可以根据其中分别表示RGB三原色或CMYK四原色(有的还包括Alpha通道)的位数进一步分类,如16位位图图片还可分为R5G6B5,R5G5B5X1(有1位不携带信息),R5G5B5A1,R4G4B4A4等等。

  位图与矢量图比较

  

图像类型

组成

优点

缺点

常用制作工具

点阵图像

像素

只要有足够多的不同色彩的像素,就可以制作出色彩丰富的图象,逼真地表现自然界的景象

缩放和旋转容易失真,同时文件容量较大

Photoshop、画图等

向量图像

数学向量

文件容量较小,在进行放大、缩小或旋转等操作时图象不会失真

不易制作色彩变化太多的图象

Flash、CorelDraw等

       

 

位图BITMAPINFOHEADERBITMAPFILEHEADER

    先来看BITMAPINFOHEADER,只写几个主要的

    biSize
包含的是这个结构体的大小(包括颜色表)

    biWidth
biHeight分别是图片的长宽

    biPlanes
是目标绘图设备包含的层数,必须设置为1

    biBitCount
是图像的位数,例如24位,8位等

    biXPelsPerMeter
biYPelsPerMeter 是现实世界中每米包含的像素数设为3780即可

    biSizeImage
图像数据的大小 = biWidth X biHeight XbiBitCount

    ---------------------------------------------------------------------------------

    
再看 BITMAPFILEHEADER

    bfType  图片的类型必须是BM0x4d42即十进制的19778

    bfOffBits
从文件头开始到颜色数据的偏移量  54+sizeof(RGBQUAD)*256

    bfSize  
图片的大小,bfOffBits + X X 位数  例如对于128X128X24位的图像  bfSize=128X128X24 +54+sizeof(RGBQUAD)*256

    bfReserved1
bfReserved1必须为0

 

 

 

BMP文件结构

如图1所示,BMP图像文件被分成4个部分:位图文件头(Bitmap File Header)、位图信息头(Bitmap Info Header)、颜色表(Color Map)和位图数据(即图像数据,Data BitsData Body)。

1部分为位图文件头BITMAPFILEHEADER,是一个结构体类型,该结构的长度是固定的,为14个字节。其定义如下:

typedef struct tagBITMAPFILEHEADER
{
WORD bfType;  
DWORD bfSize
  
WORD bfReserved1;  
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER,
*PBITMAPFILEHEADER;

BITMAPFILEHEADER
结构的各个域详细说明如下:

bfType
:位图文件类型,必须是0x424D,即字符串“BM”,也就是说,所有的“*.bmp”文件的头两个字节都是“BM”

bfSize
:位图文件大小,包括这14个字节。

bfReserved1, bfReserved2
Windows保留字,暂不用。

bfOffBits
:从文件头到实际的位图数据的偏移字节数,图1中前3个部分的长度之和。


                             


2部分为位图信息头BITMAPINFOHEADER,也是一个结构体类型的数据结构,该结构的长度也是固定的,为40个字节(WORD为无符号16位整数,DWORD为无符号32位整数,LONG32位整数)。其定义如下:

typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;    
LONG biWidth;    
LONG biHeight;    
WORD biPlanes;    
WORD biBitCount  
DWORD biCompression;  
DWORD biSizeImage;  
LONG biXPelsPerMeter;  
LONG biYPelsPerMeter;  
DWORD biClrUsed;  
DWORD biClrImportant;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER,
*PBITMAPINFOHEADER;

BITMAPINFOHEADER
结构的各个域的详细说明如下:

biSize
:本结构的长度,为40个字节。

biWidth
:位图的宽度,以像素为单位。

biHeight
:位图的高度,以像素为单位。

biPlanes
:目标设备的级别,必须是1

biBitCount
:每个像素所占的位数(bit),其值必须为1(黑白图像)、416色图)、8256色)、24(真彩色图),新的BMP格式支持32位色。

biCompresssion
:位图压缩类型,有效的值为BI_RGB(未经压缩)、BI_RLE8BI_RLE4BI_BITFILEDS(均为Windows定义常量)。这里只讨论未经压缩的情况,即biCompression=BI_RGB

biSizeImage
:实际的位图数据占用的字节数,该值的大小在第4部分位图数据中有具体解释。

biXPelsPerMeter
:指定目标设备的水平分辨率,单位是像素/米。

biYPelsPerMeter
:指定目标设备的垂直分辨率,单位是像素/米。

biClrUsed
:位图实际用到的颜色数,如果该值为零,则用到的颜色数为2biBitCount次幂。

biClrImportant
:位图显示过程中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。

3部分为颜色表。颜色表实际上是一个RGBQUAD结构的数组,数组的长度由biClrUsed指定(如果该值为零,则由biBitCount指定,即2biBitCount次幂个元素)。RGBQUAD结构是一个结构体类型,占4个字节,其定义如下:

typedef struct tagRGBQUAD
{
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
}RGBQUAD;

RGBQUAD
结构的各个域的详细说明如下:

rgbBlue
:该颜色的蓝色分量;

rgbGreen
:该颜色的绿色分量;

rgbRed
:该颜色的红色分量;

rgbReserved
:保留字节,暂不用。

有些位图需要颜色表;有些位图(如真彩色图)则不需要颜色表,颜色表的长度由BITMAPINFOHEADER结构中biBitCount分量决定。对于biBitCount值为1的二值图像,每像素占1bit,图像中只有两种(如黑白)颜色,颜色表也就有21=2个表项,整个颜色表的大小为个字节;对于biBitCount值为8的灰度图像,每像素占8bit,图像中有颜色,颜色表也就有256个表项,且每个表项的RGB分量相等,整个颜色表的大小为个字节;而对于biBitCount=24的真彩色图像,由于每像素3个字节中分别代表了RGB三分量的值,此时不需要颜色表,因此真彩色图的BITMAPINFOHEADER结构后面直接就是位图数据。

4部分是位图数据,即图像数据,其紧跟在位图文件头、位图信息头和颜色表(如果有颜色表的话)之后,记录了图像的每一个像素值。对于有颜色表的位图,位图数据就是该像素颜色在调色板中的索引值;对于真彩色图,位图数据就是实际的RGB值(三个分量的存储顺序是BGR)。下面分别就2色、 16色、256色和真彩色位图的位图数据进行说明:

对于2色位图,用1位就可以表示该像素的颜色,所以1个字节能存储8个像素的颜色值。

对于16色位图,用4位可以表示一个像素的颜色。所以一个字节可以存储2个像素的颜色值。

对于256色位图,1个字节刚好存储1个像素的颜色值。

对于真彩色位图,3个字节才能表示1个像素的颜色值。

需要注意两点:

第一,Windows规定一个扫描行所占的字节数必须是4的倍数,不足4的倍数则要对其进行扩充。假设图像的宽为biWidth个像素、每像素biBitCount个比特,其一个扫描行所占的真实字节数的计算公式如下:

DataSizePerLine = (biWidth * biBitCount /8+ 3) / 4*4

那么,不压缩情况下位图数据的大小(BITMAPINFOHEADER结构中的biSizeImage成员)计算如下:

biSizeImage = DataSizePerLine * biHeight


第二,一般来说,BMP文件的数据是从图像的左下角开始逐行扫描图像的,即从下到上、从左到右,将图像的像素值一一记录下来,因此图像坐标零点在图像左下角。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

位图Bitmap 的相关文章

  • 深度学习图像处理之VGG网络模型 (超级详细)

    VGG介绍 由牛津大学著名研究所VGG提出 斩获该年ImageNet竞赛中Localization Task 定位任务 第一名和Classification Task 分类任务 第二名 VGG网络的配置 VGG 16是许多模型中的主干网络
  • OPENCV手势识别抓取图片

    PENCV手势识别抓取图片 一位油管的小哥做的项目非常棒 照着写了一个 代码 注意 看好cvzone的版本 太新的版本中有个函数没有 如果找不到这个函数的时候请更换一下库的版本 import cv2 from cvzone HandTrac
  • 图像的二值化分割,otsu类间方差法

    二值化图像指图像中的每个像素只取两个离散的值之一 用数学公式表示为 公式中 f x y 表示一幅数字图像 X Y表示该图像中某像素的坐标值 T为 二值化的阈值 表示经过阈值运算后的二值化图像 这里0和1仅仅是一个抽象表示 并非实际像素值 它
  • c#图像几何特征匹配

    using System using System Collections Generic using System Linq using System Text using System Threading Tasks using Ope
  • gstreamer中tee如何实现动态增减支路(预览+截图+录像)

    系列文章目录 Gstreamer中获取帧数据的方式 gstreamer中如何使用probe 探针 获取帧数据 gstreamer拉流rtsp使用appsink获取帧数据 预览 截图 gstreamer中如何使用fakesink获取帧数据 预
  • windows8.1 vs2015 dlib库cpu 版本编译以及应用 library is 90, caller expects 80

    近期由于要做一个关于人脸计数的项目 因此对dlib库进行了编译和使用 其中遇到了不少问题 下面请听我一一道来 第一步 从dlib官网下载dlib源码 链接地址 https github com davisking dlib 第二步 采用cm
  • Qt创建一个自定义按钮

    1 概述 案例 编写一个自定义按钮 要求 1 给按钮添加自定义背景 2 监听按钮点击事件 2 代码案例 1 创建一个类让其继承QWidget 点击下一步下一步最后完成 2 打开MyPushButton 让其继承QPushButton 如下所
  • matlab 读取某一文件夹下的文件

    MATLAB 是一个十分强大的科学计算软件 用于各种数据分析和科学计算 在实际工作和研究过程中 我们通常将数据存储在文件中 文件存在于系统的某个目录中 如果需要读取这些文件 可以使用 MATLAB 提供的文件和文件夹操作函数 本文将介绍如何
  • 图像处理 --- 一、认识图像处理

    声明 本系列文档由学习哔站视频总结而得 后续会逐渐添加相对应的示例代码 python 1 什么是图像与图像处理 百闻不如一见 图像是客观对象的一种相似性的 生动性的描述或写真 是人类社会活动中最常用的信息载体 或者说图像是客观对象的一种表示
  • Conditional Prompt Learning for Vision-Language Models

    本文是对CoOp方法提出的改进 CoOp由论文Learning to Prompt for Vision Language Models提出 CoOp针对CLIP模型做了改进 将人工设计的提示修改为了可学习的参数 具体来说就是 CoOp不再
  • 使用Python绘制粽子消消乐,素描图(优化版,正常/漫画/写实风格),词云图,字符画图及提取轮廓

    使用Python绘制粽子消消乐 素描图 优化版 正常 漫画 写实风格 词云图 字符画图及提取轮廓 1 效果图 2 源码 2 1 素描图源码 2 2 优化版 制作不同风格的素描图 正常 漫画 写实风格 https blog csdn net
  • 图像处理_Ostu算法(大律法、最大类间方差法)

    一 算法简述 Otsu算法是一种用于二值化最佳阈值的选取方法 基本原理是根据阈值T将图像中的像素点分为C1和C2两类 不断的调整阈值T之后若此时两类之间存在最大的类间方差 那么此阈值即是最佳阈值 二 算法理论 1 基础公式 1 2 3
  • 【从小项目学图片处理】#1 答题卡识别

    说明 项目皆参考于网上 代码也有大部分参考原文 仅用于学习和练习图像处理操作 项目原文 Bubble sheet multiple choice scanner and test grader using OMR Python and Op
  • OpenCV入门【C++版】

    OpenCV基础入门 C 语言 Chapter1 读取图片 视频 摄像头 从文件读取图片 从文件读取视频 读摄像头 Chapter2 基础函数 Chapter3 调整和剪裁 Chapter4 绘制形状和文字 Chapter5 透视变换 Ch
  • 图像处理神器 ImageMagick 命令介绍

    安装完 ImageMagick 打开命令行 输入相应命令即可处理图像 所有命令前面都要加 magick 网上的教程都没说 也可能是我自己环境没配置吧 说明 内的命令表示是可选的 内表示是示例或者代号而已 magick convert sou
  • 2021全国电设(F题)openmv的图像识别之数字识别

    基于openmv的图像识别 通过参加全国电子设计大赛F题总结出openmv4的数字识别 其它版本暂时没试过 欢迎交流 openmv简介 OpenMV是一个开源 低成本 功能强大的机器视觉模块 以STM32F427CPU为核心 集成了OV77
  • MATLAB算法实战应用案例精讲-【图像处理】缺陷检测(补充篇)

    目录 前言 疵点缺陷识别 1边缘增强 1 1经典算子 1 2坯布疵点边缘检测
  • 人工智能超分辨率重建:揭秘图像的高清奇迹

    导言 人工智能超分辨率重建技术 作为图像处理领域的一项重要创新 旨在通过智能算法提升图像的分辨率 带来更为清晰和细致的视觉体验 本文将深入研究人工智能在超分辨率重建方面的原理 应用以及技术挑战 1 超分辨率重建的基本原理 单图超分辨率 利用
  • ETC纹理压缩

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • 图像分割-Grabcut法

    版权声明 本文为博主原创文章 转载请在显著位置标明本文出处以及作者网名 未经作者允许不得用于商业目的 本文的C 版本请访问 图像分割 Grabcut法 C CSDN博客 GrabCut是一种基于图像分割的技术 它可以用于将图像中的前景和背景

随机推荐

  • 使用tf.keras实现多层感知器(神经网络)的代码实现(tensorflow2.0基础入门2)

    逻辑回归与交叉熵 1 线性回归预测的是一个连续的值 2 逻辑回归给出的 是 和 否 的回答 3 逻辑回归的激活函数 采用的是 sigmoid激活函数 sigmoid函数是一个概率分布函数 即给定某个输入 它将输出为一个0到1的概率值 4 对
  • C语言入门日记

    参考 C语言入门日记 作者 9art0 发布时间 2020 08 30 16 37 46 网址 https blog csdn net GatoWong article details 108307915 spm 1001 2014 300
  • EOL while scanning string literal问题之谜

    运行以下脚本又遭遇 EOL while scanning string literal问题 coding utf 8 import arcpy import os import os path inWorkspace arcpy GetPa
  • 拓展卢卡斯定理模板完整注释

    define CRT SECURE NO WARNINGS include
  • matlab 形态学 颗粒,使用Matlab进行形态学操作

    Here is the problem A camera takes an image I of a penny a dime and a quarter lying on a white background and the coins
  • vs 中出现LINK : fatal error LNK1104: 无法打开文件“Qt5Networkd.lib”解决办法

    可以看到出现链接问题 原因是缺少Qt5Networkd库文件 解决办法如下 打开 项目 gt 属性 gt C C gt 常规 gt 附加文件目录 添加 QTDIR include QtNetwork 添加完后看看计算的值里面的路径是否存在添
  • 关于单片机位数的思考(8位、16位、32位)

    关于单片机位数的思考 8位 16位 32位 8位 16位 32位是指单片机的 字长 也就是一次运算中参与运算的数据长度 这个位是指二进制位 以8位为例 8位二进制的表达范围是0000 0000 1111 1111即十进制的0 255 即每次
  • 【Python】Pandas DataFrame 一维表二维表的转换

    目录 一 stack unstack unstack 将一维表转换为二维表 stack 将二维表转换为一维表 二 pivot melt pivot 将一维表转换为二维表 melt将二维表转换为一维表 Tips 用pandas处理数据 我们经
  • angularJS1笔记-(3)-购物车增删改查练习

    html div class container table class table table div
  • linux驱动开发(四):ioctl()函数

    前文中我们介绍了应用程序通过使用虚拟文件系统VFS提供的接口 来控制字符驱动程序 完成字符驱动设备的open close read write操作 但是如果我们想进行除此以外的其他操作 拓展一些file operations给出的接口中没有
  • 实时目标追踪:ByteTrack算法步骤详解和代码逐行解析

    文章目录 ByteTrack算法简介 算法步骤分析 算法框架流程 一 对追踪轨迹和边界框进行分类 二 对轨迹进行第一次追踪 仅针对激活状态的轨迹的高分匹配 三 对轨迹进行第二次追踪 仅针对激活状态的轨迹的低分匹配 四 对未激活状态的轨迹进行
  • 电脑提示找不到MSVCR120.dll 简单解决方法,亲测有效!

    msvcr120 dll是windows系统的一部分 它是Windows操作系统中的一个动态链接库文件 该文件包含了一些在运行使用了C 语言编写的程序时所需的函数和资源 当系统无法找到或加载msvcr120 dll文件时 会导致相关程序无法
  • 学Vue和Node.js的一点感想-[2019-01-03 10:38]

    这几天公司换了前端框架 就是打算使用Vue Vuetifyjs 来构建前端 稀里糊涂的学了点Node js 在这里记录一下感想 Vue说是是一套构建用户界面的渐进式框架 Vue 只关注视图层 采用自底向上增量开发的设计 Vue 的目标是通过
  • Linux--信号量

    1 信号量的定义 信号量是一个特殊的变量 一般取正数值 它的值代表允许访问的资源数目 获取资源时 需要对信号量的值进行原子减一 该操作被称为p操作 当信号量值为0时 代表没有资源可用 p操作会阻塞 释放资源时 需要对信号量的值进行原子加一
  • 【计算机视觉

    文章目录 一 Electronics Object Image Dataset Computer Parts datacluster ai 二 Hindi Text Image Dataset Hindi in the wild datac
  • 华为OD机试题库 2023 2022 备忘录

    华为OD机试 2023 快递投放问题 C Java JavaScript Python 华为OD机试 2023 优秀学员统计 C Java JavaScript Python 华为OD机试 2023 上班之路 是否能到达公司 C Java
  • qjason

    写了例子 解释也在例子里面 例子传在资源里面了
  • 传输层协议TCP和UDP协议

    TCP和UDP协议 TCP协议 1 TCP报文段 UDP协议 TCP的 三次握手 和 四次挥手 1 三次握手 2 四次挥手 TCP协议 TCP 协议是面向连接的 可靠的进程到进程通信的协议 TCP提供全双工服务 每一个TCP都有发送缓存和接
  • 如何安装免费https证书

    主页 可以防止数据在传输过程中产生的隐私泄露的问题 原来的网站在经过ssl证书的签发后会变成https开头 下面记录一下配置https加密的整个过程 文章目录 购买域名 设置https加密 购买域名 首先第一步我们为了防止自己的公网ip暴露
  • 位图Bitmap

    位图图像 bitmap 亦称为点阵图像或绘制图像 是由称作像素 图片元素 的单个点组成的 这些点可以进行不同的排列和染色以构成图样 当放大位图时 可以看见赖以构成整个图像的无数单个方块 扩大位图尺寸的效果是增大单个像素 从而使线条和形状显得