【图像处理】-不同的图像存储格式

server/2025/2/7 23:39:11/

看到了前面的基础操作介绍,我们再了解一下不同图像的存储格式,更有利于我们理解图像处理的原理。

图像存储格式详细介绍

1. BMP(BitMap Picture)

发展历史

BMP是一种位图文件格式,由微软公司于1986年推出。它最初是为Windows操作系统设计的,后来逐渐被其他操作系统所支持。由于其简单易用的特点,在早期计算机图形学中得到了广泛应用。

描述

BMP是一种与设备无关的位图格式,这意味着无论何种显示设备都可以正确地渲染该图像。BMP文件由四个部分组成:文件头、位图信息头、颜色表(可选)和位图数据。其中,文件头用于描述文件的基本信息;位图信息头则包含了关于图像尺寸、色彩深度等详细信息;颜色表定义了图像中使用的颜色;而位图数据则是实际的像素值。

存储结构示例
字段名称长度(字节)描述
文件类型2标识文件为BMP格式 (BM)
文件大小4整个文件的大小
保留值4保留未使用
数据偏移量4从文件开头到图像数据之间的字节数
大小4本信息头的长度
宽度4图像宽度,以像素为单位
高度4图像高度,以像素为单位
色彩平面数2总是设置为1
位数/像素2每个像素占用的位数
压缩方式4表示是否压缩及采用何种压缩算法
图像大小4压缩后的图像数据大小
水平分辨率4每米的像素数
垂直分辨率4每米的像素数
使用的颜色数4颜色表中颜色的数量
重要颜色数4对图像显示至关重要的颜色数量
实际图片数据说明

假设我们有一张10x10像素的单色(黑白)BMP图像,每个像素占1位,总共有100个像素点。文件结构如下:

  • 文件头:

    • 文件类型: BM (2字节)
    • 文件大小: 54 + 100 = 154字节 (4字节)
    • 保留值: 0 (4字节)
    • 数据偏移量: 54字节 (4字节)
  • 位图信息头:

    • 大小: 40字节 (4字节)
    • 宽度: 10像素 (4字节)
    • 高度: 10像素 (4字节)
    • 色彩平面数: 1 (2字节)
    • 位数/像素: 1位 (2字节)
    • 压缩方式: 0 (无压缩) (4字节)
    • 图像大小: 100字节 (4字节)
    • 水平分辨率: 2835 DPI (4字节)
    • 垂直分辨率: 2835 DPI (4字节)
    • 使用的颜色数: 2 (4字节)
    • 重要颜色数: 0 (4字节)
  • 颜色表:

    • 黑色: RGB(0, 0, 0) (4字节)
    • 白色: RGB(255, 255, 255) (4字节)
  • 位图数据:

    • 按行排列的100个像素点,每个像素点占1位,共13字节(因为每8个像素点需要1字节存储)

2. JPEG(Joint Photographic Experts Group)

发展历史

JPEG是由联合图像专家组在1992年制定的一种有损压缩标准,旨在解决数字照片和其他连续色调图像所需的大量存储空间问题。JPEG格式因其高效的压缩比和良好的视觉质量而在互联网上广泛传播。

描述

JPEG采用了基于离散余弦变换(DCT)的压缩技术,可以显著减少文件体积而不明显影响画质。JPEG文件由一系列标记段组成,每个标记段包含一个两字节的标识符、两个字节表示内容长度以及具体的数据。

存储结构示例
标记段长度(字节)描述
SOI (Start of Image)2文件开始标志 (FF D8)
APP0 (JPEG应用段0)16应用程序特定信息
DQT (定义量化表)67量化表参数
SOF0 (开始帧0)17帧头部信息
DHT (定义哈夫曼表)328哈夫曼编码表
SOS (开始扫描)12 + 图像数据 + EOI (End of Image, 2字节)扫描开始及结束标志 (FF DA, FF D9)
实际图片数据说明

假设我们有一个简单的JPEG图像,包含以下标记段:

  • SOI: FF D8
  • APP0: 包含JFIF头信息
  • DQT: 定义量化表
  • SOF0: 帧头部信息,例如:
    • 图像宽度: 640像素
    • 图像高度: 480像素
    • 精度: 8位
  • DHT: 定义哈夫曼编码表
  • SOS: 开始扫描,后跟压缩后的图像数据
  • EOI: 文件结束标志 FF D9

3. PNG(Portable Network Graphics)

发展历史

PNG格式是在1995年由一群开发者创建,作为GIF格式的替代品。PNG不仅支持透明背景,还提供了更好的压缩效果,并且是完全无损的。随着Web技术的发展,PNG成为了网页设计师们最喜爱的图像格式之一。

描述

PNG是一种无损压缩的位图格式,具有跨平台兼容性。PNG文件由一个固定的签名序列后跟多个块构成。每个块都有自己的类型代码、长度字段和校验和,确保数据完整性。

存储结构示例
长度(字节)描述
文件签名8确认文件为PNG格式 (89 50 4E 47 0D 0A 1A 0A)
IHDR (Image Header)17图像基本信息如宽度、高度等
PLTE (Palette)至少3n+1调色板中的颜色条目
IDAT (Image Data)至少12实际图像数据
IEND (Image Trailer)12文件结束标志
实际图片数据说明

假设我们有一个简单的PNG图像,包含以下块:

  • 文件签名: 89 50 4E 47 0D 0A 1A 0A
  • IHDR: 包含图像宽度、高度、位深度等信息
    • 宽度: 640像素
    • 高度: 480像素
    • 位深度: 8位
    • 颜色类型: 真彩色带Alpha通道
  • PLTE: 如果是调色板图像,则包含调色板条目
  • IDAT: 压缩后的图像数据
  • IEND: 文件结束标志

4. GIF(Graphics Interchange Format)

发展历史

GIF最早出现在1987年,由CompuServe公司开发。最初版本被称为GIF87a,随后在1989年进行了改进,推出了GIF89a版本,增加了对动画和透明度的支持。尽管存在版权争议,但GIF仍然非常流行,特别是在社交媒体平台上分享简短动画时。

描述

GIF使用LZW压缩算法进行无损压缩,适合存储具有较少颜色变化的简单图形或小型动画。GIF文件结构相对简单,主要包括文件头、逻辑屏幕描述符、全局颜色表(如果有的话)、图像描述符、局部颜色表(如果有的话)以及图像数据。

存储结构示例
字段名称长度(字节)描述
文件头6“GIF87a” 或 “GIF89a”
逻辑屏幕描述符7包含屏幕宽度、高度等信息
全局颜色表3nRGB三元组组成的调色板
图像描述符10指定图像位置和尺寸
局部颜色表3m如果存在,则覆盖全局颜色表
图像数据变长LZW压缩后的像素流
实际图片数据说明

假设我们有一个简单的GIF图像,包含以下字段:

  • 文件头: GIF89a
  • 逻辑屏幕描述符:
    • 宽度: 100像素
    • 高度: 100像素
    • 调色板大小: 256色
  • 全局颜色表: 包含256个RGB三元组
  • 图像描述符:
    • 左位置: 0
    • 上位置: 0
    • 宽度: 100像素
    • 高度: 100像素
  • 图像数据: LZW压缩后的像素流

http://www.ppmy.cn/server/165795.html

相关文章

阿里云不同账号vpc对等连接

目录 一,VPC对等连接介绍 1,VPC功能介绍 2,使用场景 二,准备vpc,和ECS服务器 1,第一个账号vpc网络/网段 ​编辑 2,第一个账号下的ECS实例 ip:172.19.45.29 ​编辑 3, 第二个账号vpc网络/网段 4&…

AI开发模式:ideal或vscode + 插件continue+DeepSeek R1

如何在 VSCode 中结合插件 Continue 和 DeepSeek 构建智能货柜AI开发环境的详细指南,涵盖环境配置、算法开发与模型优化全流程: 1. 环境搭建与工具选型 核心工具 工具/插件用途推荐配置VSCode主开发环境,支持多语言与插件扩展安装Python/C++/CUDA扩展ContinueAI代码助手(类…

游戏引擎学习第87天

当直接使用内存时,可能会发生一些奇怪的事情 在直接操作内存时,一些意外的情况可能会发生。由于内存实际上只是一个大块的空间,开发者可以完全控制它,而不像高级语言那样必须遵守许多规则,因此很容易发生错误。在一个…

接口测试Day11-代码优化、生成测试报告、日志收集、全量字段校验

获取请求头 1、. 在 common/ 下 创建 get_header.py 文件 2. 在 文件内 创建 get_header() 函数,实现 登录成功,获取令牌,拼接成 请求头,返回。 3. 在 scripts/ 的测试脚本文件中,添加 setUpClass 方法,调用…

kakailio官网推荐的安装流程ubuntu 22.04

https://kamailio.org/docs/tutorials/6.0.x/kamailio-install-guide-git/ # 非必须项 wget -O- https://deb.kamailio.org/kamailiodebkey.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/kamailio.gpg在/etc/apt/sources.list文件追加以下内容 deb [signed-by/usr/sh…

Rust中使用ORM框架diesel报错问题

1 起初环境没有问题:在Rust开发的时候起初使用的是mingw64平台加stable-x86_64-pc-windows-gnu编译链,当使用到diesel时会报错,如下: x86_64-w64-mingw32/bin/ld.exe: cannot find -lmysql具体信息很长这是主要信息是rust找不到链…

14JavaWeb——SpringBoot原理

SpingBoot原理 在前面十多天的课程当中,我们学习的都是web开发的技术使用,都是面向应用层面的,我们学会了怎么样去用。而我们今天所要学习的是web后端开发的最后一个篇章springboot原理篇,主要偏向于底层原理。 我们今天的课程安…

解锁Spring Boot 3.1 + JDK 17:分布式系统的变革力量

分布式系统发展的现状与挑战 在当今数字化时代,分布式系统已成为互联网技术领域的核心支撑。从电商平台的海量交易处理,到社交网络的实时互动,再到金融领域的安全交易保障,分布式系统无处不在,它如同无形的纽带&#…