我想制作自己的图像格式和库来阅读它。
我已多次尝试从人们那里得到这些信息,他们都说“去研究现有的图形SDK之一”,我做了,它……
1:尽管某些程序可能会使用文件扩展名,但大多数程序会查看标题数据。大多数格式都有某种标题,它提供的信息决定了信息的处理方式,因此可能会问库,“这个文件的标题看起来像是一种你可以访问的文件吗?”
以下是用于解码许多程序使用的png文件的库的示例,包括Gimp: https://sourceforge.net/p/libpng/code/ci/master/tree/png.c
它以32位整数的形式返回颜色数据,称为png_int_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位整数存储图像数据是相当标准的。易于使用,易于在内存中对齐等。
1:程序在显示图像文件时会发生什么?
它通常会要求操作系统解码图像。操作系统可能会使用许多库 的libtiff , 的libpng , 的libjpeg 等
通过使用操作系统而不是直接尝试读取图像文件,应用程序可以使用最新版本的库获得操作系统的优势。因此,如果您今天编写应用程序并且不再更新它,5年后,如果它使用操作系统,它可能能够读取给定文件格式的更新版本。
例如,它是否寻找具有该文件扩展名的图形库作为其名称(以及在哪里?),然后阅读将其转换为颜色值列表的规则?
通常,操作系统提供更高级别的接口。例如,在macOS上,有 CoreGraphics中 ,和 的ImageIO 。
或者是将它直接转换为机器代码并将其存储在内存中?
图像文件中没有涉及机器代码。 (好吧,通常不会。我确定有人在某个地方做过。)图像文件通常只以简单的方式存储数据。该库可以对数据进行解压缩和/或解码,此时您可能有RGBA(或ARGB,或BGRA等变体)或YCbCr之类的东西。操作系统可以进行进一步的转换以获得调用者请求的确切数据类型。
2:如果我编写了其中一个图形库,我将如何确保程序能够找到它?
通常有一种方法可以将您的图像编解码器注册到操作系统,以便程序可以使用它。这取决于操作系统。
通常(给出一个图像编辑器或游戏引擎的例子,或窗口图片预览等)程序会自动查看新的图像库,还是我需要修改程序才能知道它存在? (这个答案会让我知道它会有多麻烦)
这取决于程序。有些只允许特定格式,有些将使用操作系统支持的任何格式。另外一些还增加了对OS通常不支持的其他格式的支持。例如,Photoshop允许开发人员编写自己的图像导入器和导出器。如果用户安装了导入器/导出器,则会获得该功能,否则他们不会(除非操作系统支持)。
3:是否有一些标准数据格式,所有图形应用程序都存储图像颜色数据?
有一些常见的 - .png,.jpg和.tif都得到广泛支持。在许多情况下甚至处理.psd(Photoshop)文件,但并非所有功能都适用于所有情况。