Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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
Language agnostic 事物是如何直观地表现出来的?_Language Agnostic_Image_Monitor_Pixel_Representation - Fatal编程技术网

Language agnostic 事物是如何直观地表现出来的?

Language agnostic 事物是如何直观地表现出来的?,language-agnostic,image,monitor,pixel,representation,Language Agnostic,Image,Monitor,Pixel,Representation,我是一个初学者,我想知道图片、视频、窗口和按钮等是如何在屏幕上显示的。我不是问它是用gtk还是wxwidgets制作的,我的问题是,让像素以他们的方式出现背后的基本思想是什么。GUI库究竟用什么将它们放到屏幕上?阅读Wikipedia上的条目,它涵盖了基础知识。最后一个问题的简短回答:GUI库调用操作系统函数来绘制UI元素,而UI元素又调用相应的显示硬件驱动程序。驱动程序通过写入外部可访问的端口向硬件发送命令,这些端口映射到计算机内存中的一个特殊区域或I/O区域(请参见Wikipedia)。最基

我是一个初学者,我想知道图片、视频、窗口和按钮等是如何在屏幕上显示的。我不是问它是用gtk还是wxwidgets制作的,我的问题是,让像素以他们的方式出现背后的基本思想是什么。GUI库究竟用什么将它们放到屏幕上?

阅读Wikipedia上的条目,它涵盖了基础知识。

最后一个问题的简短回答:GUI库调用操作系统函数来绘制UI元素,而UI元素又调用相应的显示硬件驱动程序。驱动程序通过写入外部可访问的端口向硬件发送命令,这些端口映射到计算机内存中的一个特殊区域或I/O区域(请参见Wikipedia)。

最基本的是,操作系统公开一组基本绘图API(gdi、directx、gdi+、opengl)然后调用显示驱动程序,然后更新“视频内存”。回到DOS时代,您可以手动更新它,但随着大量硬件系统的出现,这变得越来越困难,因此您可以指示视频驱动程序为您进行更新

现在,一旦它进入视频内存,信息就会按顺序发送到监视器,逐行扫描(逐行读取)。如果你在视频上传到显示器时更新了视频内存,你会得到所谓的撕裂(游戏中的v-sync设置避免的东西)

为了避免在上传过程中撕裂和锁定视频内存,通常会使用一种称为双缓冲的技术,在图形卡上实际上有两个“视频内存”缓冲区,当您完成上传到其中一个并开始显示器扫描后,该卡上载第一个缓冲区,并允许您将新信息写入第二个缓冲区,从而使过程并行化

注意:这是关于它的2D部分,因为这似乎是您要问的。3D部分与之类似,但它有一个附加层,一旦你将顶点传递给显示器驱动程序,它就会将它们投射到“屏幕空间”中,并将它们逐行扫描上传到视频内存中,然后再上传到显示器上。

概述 通常,原始形式的像素数据分组称为帧缓冲区。这是相同大小的值的一维数组。每个值的大小取决于使用的颜色空间和颜色深度。例如,32位RGBA帧缓冲区可以在C中这样定义:
unsigned int fb[width*height];,假设sizeof int为4

硬件通常将RGB颜色空间用于硬件图形,如OpenGL和DirectX,以及直接帧缓冲区访问,如Linux上的/dev/fb和Windows上的GDI+。电影的硬件解码通常依赖于YCbCr颜色空间。某些图像文件格式也将其数据保存在RGB以外的其他颜色空间中,但会转换为RGB并传递给它们使用的API

像素颜色 假设RGB颜色空间为:

独立颜色通道(真彩色) 真彩色是三个或四个颜色通道中每个通道的一个组件,其中单独的颜色通道值表示每个颜色的强度。如果它有一个alpha通道,则其工作方式相同,但alpha的含义取决于上下文。通常alpha表示不透明度,其中最低值为100%半透明,最高值为100%不透明。例如:(0255,0128)表示50%半透明绿色,给定RGBA真彩色,每个通道使用8位颜色深度

调色板 对于调色板,单个像素值是颜色数组的索引,通常为真彩色(但并不意味着每个通道8位)。索引的范围是可以表示的颜色数。8位调色板索引以前很常见,尤其是在20世纪90年代早期的商品VGA硬件上。然后,硬件可以在2^24种颜色的池中一次显示256种颜色的子集

颜色空间 我不想回答得太长,我认为维基百科对这个问题的回答比我好,所以这里有一个链接: 颜色空间是表示颜色和颜色组合的方式

我应该为我的应用程序选择哪个颜色空间? 这取决于应用程序如何处理像素数据。不同的颜色空间定义了不同的需求。YCbCr用于移动图片,因为它定义了伽马级别,例如NTSC和PAL标准也定义了伽马级别。sRGB也做同样的事情,只适用于计算机显示器,您可以为特定屏幕选择gamma/颜色配置文件。当您在屏幕上看到的颜色与在最终介质上看到的颜色尽可能接近时,这些颜色空间非常方便。当伽马射线不重要时,以及当计算机屏幕是最终媒介时,通常使用RGB。它很容易使用,因为颜色空间是线性的。因此,对于电脑游戏,您可能会使用RGB,但对于Photoshop或GIMP等图像处理程序,您将支持HSV/HSL/sRGB和CMYK。
在处理API返回的帧缓冲区中的原始像素时,可以采用RGB,除非另有说明。使用移动图片时,请假定为YCbCr。硬件支持多种不同的数据编码方式。确保您选择的格式与硬件支持和性能有关。

hmm我仍然不了解全局。它是如何与硬件通信的?谢谢你的回复,我在哪里可以深入了解这些。你建议我做什么谢谢你,呵呵。。。谁还记得第一个模拟城市?市场上的每一张图形卡都有一个不同的可执行文件。directx演示链的文档包含很多信息,包括双缓冲详细信息。opengl文档中也有一些东西,虽然我没有读过太多的细节。我认为你的问题太开放了