图形文件格式类型如何工作?

How do graphic file format types work?

我非常想了解图形文件格式(PNG、JPG、GIF)的工作原理。是否有任何代码示例演示如何制作这些文件以及如何解释它们(在浏览器中查看)?

最详细的信息可以通过阅读文件格式规范并以您最了解的语言实现解析器来获得。

一个好的方法是读取格式并将其转换为四字节元组数组(RGBA,颜色的红色、绿色、蓝色和 alpha 部分)这将允许您将此格式用作in between format 格式之间方便转换。同时大部分API都支持这种原始格式的显示。

一个好的入门格式是 BMP. As old as it is, if this is your first encounter with writing a parser this is a safe an 'easy' format. A good second format is PNG。从未压缩的变体开始,然后添加压缩。

下一步是 TGA 以学习阅读块或 JPG 以了解有关压缩的更多信息。

额外提示:writers 的某些实现包含(编辑)错误,导致图像违反格式。其他人添加了从未达到官方规格的额外功能。在编写解析器时,这可能是一个真正的痛苦。当您 运行 遇到问题时,请始终猜测您正在尝试阅读的图像。一个好的 binary/hex 文件 reader/editor 可能是一个非常有用的工具。我用的是 AXE,如果我没记错的话,它允许你用一种格式覆盖十六进制代码,这样你就可以快速识别 header 和块。

无论您使用哪种图形文件格式,您都需要了解所有图形文件共有的基本性质。

  • 文件Header
    1. 文件类型、版本(时间和日期戳 - 如果包含)
    2. 可能的数据structure/s信息或块
    3. 如果压缩可用,以及哪种类型、字节顺序(字节序)、具有透明度,以及其他各种标志,则预期颜色类型的标志。
  • 图像数据信息
    1. 宽度通常以像素为单位,有时以像素、位或字节为单位
    2. 高度通常以像素为单位,有时以像素、位或字节为单位
    3. 每像素位数或像素深度
    4. 图像大小(以字节为单位):numPixelsWidth * numPixelsHeight *(每个像素的(位或字节))
    5. 颜色类型:- 每个像素都有可以变化的颜色数据
      • 灰度
      • 调色板
      • 颜色 RGB
      • 颜色 RGBA
      • 可能的其他人
  • 如果存在压缩,则使用哪种编码和编码
  • 实际图像数据

一旦您理解了这个基本结构,那么一旦您了解了您正在使用的文件结构的规范,解析图像文件就会变得更加容易。当您知道要读入包含所有 headers 和块的文件指针的字节数时,您可以将文件指针推进到将读入或写出所有像素(颜色)数据的数据结构。在许多情况下,像素数据通常是每像素 24 位,这样每个通道 RGBA - 红色、绿色、蓝色和 Alpha 都是 8 位,或者一个字节与无符号字符相同。这在结构或二维数组中表示。无论哪种方式,一旦您知道文件的结构并知道如何读取实际图像或颜色数据,您就可以轻松地将其存储到一个数组中。然后你从那里用它做什么取决于你的应用程序的需要。