事物如何在视觉上呈现?

时间:2009-12-15 09:07:59

标签: language-agnostic image monitor pixel representation

我是初学者,我想知道如何在屏幕上直观地呈现图片,视频,窗口和按钮等。我不是在问它是用例如gtk还是wxwidgets制作的,我的问题是让像素按照它们的方式出现的基本思路是什么。 GUI库使用什么来将它们放在屏幕上?

4 个答案:

答案 0 :(得分:3)

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

现在,一旦它进入视频内存,信息就会顺序发送到您的显示器,逐行扫描(逐行读取)。如果您在将视频内存上传到显示器时更新视频内存,则会出现所谓的撕裂(游戏中的事物同步设置)。

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

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

答案 1 :(得分:1)

阅读维基百科在raster graphics上的条目,它涵盖了基础知识。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

概述

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

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

像素颜色

假设RGB色彩空间,单个像素的颜色可以用这些方式表示(列表不完整):

单独的颜色通道(真彩色)

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

调色板

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

颜色空间

我不想让这个答案太长,我认为维基百科无论如何都比我更好地回答这个问题,所以这里有一个链接:Wikipedia: color space 颜色空间是表示颜色和颜色组合的方法。

我为我的应用选择哪个色彩空间?

这取决于应用程序对像素数据的作用。不同的颜色空间定义了不同的需求。 YCbCr用于运动图像,因为它定义了伽马级别,例如,再次由NTSC和PAL标准定义。 sRGB 执行相同的操作,仅适用于计算机显示器,您可以在其中为特定屏幕选择伽马/颜色配置文件。当您在屏幕上感知的颜色与最终介质上感知的颜色接近时,这些颜色空间非常方便。当伽玛不重要时,以及当计算机屏幕是最终媒介时,经常使用RGB。它很容易使用,因为颜色空间是线性的。因此,对于计算机游戏,您可能会使用RGB,但对于像Photoshop或GIMP这样的图像处理程序,您将支持HSV / HSL / sRGB和CMYK。 使用API​​返回的帧缓冲区中的原始像素时,除非另有说明,否则可以采用RGB。使用动态图片时,请假设为YCbCr。硬件支持许多不同的数据编码方式。确保选择与硬件支持和性能有关的格式。