【问题标题】:How do programs interface with graphics libraries?程序如何与图形库交互?
【发布时间】:2019-03-04 05:31:23
【问题描述】:

我想制作自己的图像格式和一个库来读取它。

我多次尝试从人们那里获取这些信息,他们都说“去研究现有的图形 SDK 之一”,我照做了,但它什么也没教我,它只是教我如何使用 Open GL。 .这不是我想要的。我想知道程序打开图像时发生的内部工作,因此我可以在自己的库中手动处理此操作。

我研究过多种图像格式,我知道它们中的信息是如何构造的,但是程序打开它们后,它必须知道如何将它们转换为RGBA数组,对吗?我想这就是图形库的用武之地?

图形库是关于如何将图像读取为我假设的十六进制颜色数组的指令列表?所以我真的有 3 个问题,我希望我能说清楚:

1:当一个程序呈现一个图像文件时会发生什么?例如,它是否会查找具有该文件扩展名的图形库作为其名称(以及在哪里?),然后阅读将其转换为颜色值列表的规则?还是直接转成机器码存入内存?

2:如果我编写了这些图形库之一,我将如何确保程序可以找到它?通常(以图像编辑器或游戏引擎或 Windows 图片预览等为例)程序是否会自动查看新的图像库,或者我是否需要修改程序才能知道它存在? (这个答案会让我知道会有多麻烦)

3:是否有某种标准数据格式可供所有图形应用程序存储图像颜色数据?

【问题讨论】:

  • 应用程序通常有一组他们可以读取的已定义图像格式。对于这些,他们要么使用库(它们随应用程序一起提供并提前链接),要么编写一些自定义代码。这些库的外观很大程度上取决于图像格式支持的内容。一种常见的方法是有一个函数,它接受一个路径并返回一个像素值数组。

标签: graphics


【解决方案1】:

1:虽然某些程序可能会使用文件扩展名,但大多数会查看标题数据。大多数格式都有某种标题,它提供了决定如何处理信息的信息,所以库可能会被问到,“这个文件的标题看起来像一种你可以访问的文件吗?”

这是一个用于解码许多程序(包括 Gimp)使用的 png 文件的库的示例:https://sourceforge.net/p/libpng/code/ci/master/tree/png.c

它以称为 png_int_32 的 32 位整数形式返回颜色数据。在本页底部,您可以看到 Gimp 用于解码各种图像格式的库列表:https://www.gimp.org/source/#gimp-source-code

2:某些程序经过硬编码以使用特定的库,无法使用新格式进行扩展。较大的图形程序,如 Photoshop 或 Gimp,使用插件。您必须为要支持的程序创建使用您的库的插件。以下是创建 Gimp 插件的方法:https://developer.gimp.org/writing-a-plug-in/1/index.html

创建 Photoshop 插件的方法如下:https://www.adobe.io/apis/creativecloud/photoshop.html

要使程序像那些程序一样可扩展需要额外的努力,所以很多人都不会打扰。您将只能在支持插件或开源的程序中使用您的库,因此您可以将您的库添加到您自己的该程序版本中。

3:以 32 位整数存储图像数据是相当标准的。易于使用,易于在内存中对齐等。

【讨论】:

    【解决方案2】:

    1:当一个程序呈现一个图像文件时会发生什么?

    它通常会要求操作系统对图像进行解码。操作系统可能会使用许多库,就像LibTIFFlibpnglibjpeg 等一样。

    通过使用操作系统而不是直接尝试读取图像文件,应用程序可以使用最新版本的库获得操作系统的好处。因此,如果您今天编写一个应用程序并且不再更新它,从现在起 5 年后,如果它使用操作系统这样做,它可能能够读取给定文件格式的更新版本。

    例如,它是否会查找具有该文件扩展名的图形库作为其名称(以及在哪里?),然后阅读将其转换为颜色值列表的规则?

    通常操作系统会提供更高级别的接口。例如,在 macOS 上,有 CoreGraphicsImageIO

    还是直接转换成机器码存入内存?

    图像文件中不涉及机器代码。 (嗯,通常不会。我相信有人在某处做过。)图像文件只存储数据,通常以简单的方式。该库可以解压缩和/或解码数据,此时您可能拥有 RGBA(或 ARGB 或 BGRA 之类的变体)或 YCbCr 或类似的东西。操作系统可能会进行进一步的转换以获得调用者请求的确切数据类型。

    2:如果我编写了这些图形库之一,我将如何确保程序可以找到它?

    通常有一种方法可以将您的图像编解码器注册到操作系统,以便程序可以使用它。这因操作系统而异。

    通常(以图像编辑器或游戏引擎或 Windows 图片预览等为例)程序会自动查看新的图像库还是需要修改程序才能知道它的存在? (这个答案会让我知道会有多麻烦)

    这因程序而异。有些只允许特定格式,有些将使用操作系统支持的任何格式。有些还添加了对操作系统通常不支持的其他格式的支持。例如,Photoshop 允许开发人员编写自己的图像导入器和导出器。如果用户安装了您的导入器/导出器,他们会获得该功能,否则他们不会(除非操作系统支持)。

    3:是否有某种标准数据格式可供所有图形应用程序存储图像颜色数据?

    有一些常见的 - .png、.jpg 和 .tif 都得到广泛支持。在许多情况下,即使是 .psd (Photoshop) 文件也会得到处理,但并非所有功能都适用于所有情况。

    【讨论】:

      猜你喜欢
      • 2012-05-06
      • 2021-08-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 2011-01-23
      • 2011-08-26
      • 2015-04-27
      相关资源
      最近更新 更多