我想制作自己的图像格式和库来阅读它。
我已经尝试过多次从人那里获取此信息,他们都说"去研究现有的图形SDK",我做到了,这教会了我什么也没有教给我,它只是教会我如何使用Open GL ..。那不是我想要的。我想知道程序打开图像时发生的内部工作,因此我可以在自己的库中手动处理此操作。
我已经研究了多种图像格式,我知道如何构建其中的信息,但是在程序打开它们之后,必须知道如何将它们转换为RGBA数组,对吗?那是我认为图形库的来源?
图形库是我认为如何将图像读取为我假设的十六进制颜色数组的指令列表?所以我真的有3个问题,希望我能清楚地表明它们:
1:当程序带有图像文件时会发生什么?例如,它是否会寻找具有该文件扩展名的图形库(以及在哪里?),然后阅读将其转换为颜色值列表的规则?还是将其直接转换为机器代码并将其存储在内存中?
2:如果我写了其中一个图形库,我将如何确保程序可以找到它?通常(给出一个图像编辑器或游戏引擎的示例,或Windows图片预览等),程序会自动看到新的图像库,还是我需要修改程序以知道其存在?(这个答案会让我知道它会有多麻烦)
3:是否有一些标准数据格式,所有图形应用程序都会存储图像颜色数据?程序,大多数会查看标题数据。大多数格式都有某种标题,可以提供确定信息将如何处理的信息,因此可以询问库:"该文件的标题看起来像您可以访问的文件?"
这是用于解释许多程序使用的png文件的示例,包括gimp:https://sourceforge.net/p/libpng/code/code/ci/ci/master/master/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位ints中是相当标准的。易于使用,易于在内存中对齐等
1:当程序带有图像文件时会发生什么?
通常会要求操作系统解码图像。操作系统可能会使用许多库,就像libtiff,libpng,libjpeg等
通过使用操作系统而不是直接尝试读取图像文件,应用程序使用库的最新版本获得了操作系统的好处。因此,如果您今天编写一个应用程序,并且不再更新它,从现在起5年后,如果它使用OS来执行此操作,它也许可以读取较新的版本。
例如,它是否会寻找带有该文件扩展名的图形库(以及在哪里?),然后阅读将其转换为颜色值列表的规则?
通常,OS提供了一个高级接口。例如,在MacOS上,有核心图和Imageio。
还是将其直接转换为机器代码并将其存储在内存中?
图像文件中不涉及机器代码。(嗯,通常不是。我敢肯定有人在某个地方做过。)图像文件通常以直接的方式存储数据。库可以解压缩和/或解码数据,到那时,您可能具有RGBA(或诸如ARGB,BGRA之类的变体)或YCBCR或类似的内容。操作系统可能会进行进一步的转换,以获取呼叫者请求的确切数据类型。
2:如果我写了其中一个图形库,我将如何确保程序可以找到它?
通常,有一种方法可以在操作系统上注册您的图像编解码器,以便该程序可用于程序。这会有所不同。
通常(给定一个图像编辑器或游戏引擎的示例,或Windows图片预览等)是否会自动查看新的图像库,或者我需要修改程序以了解其存在?(这个答案会让我知道它会有多麻烦)
随程序而变化。有些仅允许特定格式,有些将使用操作系统支持的任何格式。另一些人还增加了对OS通常不支持其他格式的支持。例如,Photoshop允许开发人员编写自己的图像进口商和出口商。如果用户安装了您的进口商/出口商,则可以获得功能,否则没有(除非OS支持它)。
3:是否存在所有图形应用程序存储图像颜色数据的标准数据格式?
有一些常见的 - .png,.jpg和.tif都得到了广泛的支持。在许多情况下都可以处理.psd(photoshop)文件,尽管并非所有功能在所有情况下都起作用。