Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graphics 程序如何与图形库交互?_Graphics - Fatal编程技术网

Graphics 程序如何与图形库交互?

Graphics 程序如何与图形库交互?,graphics,Graphics,我想制作自己的图像格式和一个库来阅读它 我曾多次尝试从人们那里获得这些信息,他们都说“去研究一个现有的图形SDK”,我做了,但它什么也没教我,它只是教我如何使用OpenGL。。。那不是我想要的。我想知道程序打开图像时发生的内部工作,这样我就可以在自己的库中手动处理此操作 我研究过多种图像格式,我知道其中的信息是如何构造的,但在程序打开它们之后,它必须知道如何将它们转换为RGBA数组,对吗?我想这就是图形库的用武之地吧 图形库是一个关于如何将图像读取为我假设的十六进制颜色数组的说明列表?所以我有三

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

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

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

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

1:当程序显示图像文件时,会发生什么?例如,它是否查找以该文件扩展名为名称(以及在何处?)的图形库,然后阅读将其转换为颜色值列表的规则?还是将其直接转换为机器代码并存储在内存中

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


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

1:尽管某些程序可能使用文件扩展名,但大多数程序会查看标题数据。大多数格式都有某种类型的头文件,它提供了确定如何处理信息的信息,因此库可能会被问到,“此文件的头文件看起来像您可以访问的文件吗?”

以下是用于解码许多程序(包括Gimp)使用的png文件的库的示例:

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

2:有些程序是硬编码的,使用特定的库,不能用新的格式扩展。较大的图形程序,如Photoshop或Gimp,使用插件。您必须创建插件,使用您的库来支持您想要支持的程序。以下是如何创建Gimp插件:

以下是如何创建Photoshop插件:

要使一个程序像这些程序一样具有可扩展性,需要付出额外的努力,所以很多人不必费心。您只能在支持插件或开源的程序中使用库,因此您可以将库添加到您自己的程序版本中


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

1:尽管某些程序可能使用文件扩展名,但大多数程序会查看头数据。大多数格式都有某种类型的头文件,它提供了确定如何处理信息的信息,因此库可能会被问到,“此文件的头文件看起来像您可以访问的文件吗?”

以下是用于解码许多程序(包括Gimp)使用的png文件的库的示例:

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

2:有些程序是硬编码的,使用特定的库,不能用新的格式扩展。较大的图形程序,如Photoshop或Gimp,使用插件。您必须创建插件,使用您的库来支持您想要支持的程序。以下是如何创建Gimp插件:

以下是如何创建Photoshop插件:

要使一个程序像这些程序一样具有可扩展性,需要付出额外的努力,所以很多人不必费心。您只能在支持插件或开源的程序中使用库,因此您可以将库添加到您自己的程序版本中

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

1:当程序显示图像文件时,会发生什么

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

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

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

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

还是将其直接转换为机器代码并存储在内存中

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

2:如果我写了其中一个图形库,我将如何确保程序能够找到它

通常有一种方法可以在操作系统中注册您的图像编解码器,这样您就可以使用它了