在C语言中显示屏幕上的像素

20

如何使用C语言更改显示器上的像素?

不做任何假设:我正在使用Linux机器从控制台执行此操作。 我不想使用GUI工具包或框架来绘制像素。 我不想在窗口中绘制像素。 我想直接将像素绘制到屏幕上。

编辑:我有一个屏幕。 我在运行Linux的笔记本电脑上,从控制台操作。 我希望使用不涉及X的解决方案,因为我宁愿学习如何使用X而不是如何使用X。

如果需要更多信息,请询问,但不要假设。我不打算构建GUI,这也是阻止假设的主要目的,因为我不希望人们假设我正在以长方式处理事情,当实际上我只是在尝试。

编辑2:您可以使用任何与X11相关的库,前提是您能够解释其工作原理。


1
好的,我想你是对的 Kos。我只是不希望人们认为我想走冗长的道路来制作GUI而没有工具包,实际上我更愿意了解显示器是如何工作的。 - DavidJFelix
2
如果我们不能做任何假设,我就不能假设问题是用英语提出的,甚至不能假设描述问题的字符与原帖作者输入的字符有任何关系。好吧,这很荒谬,但这是我非常讨厌的事情之一,人们说“不要做任何假设!”,实际上他们只是想消除一些基本的假设。 - LarsH
当人们做出假设时,这是我最讨厌的事情之一。 :) - DavidJFelix
6个回答

15
如果我们真的什么都不假设,那我们甚至能假设 X 没有在运行吗?同样地,我们能否假设存在一个视频卡呢?也许 Linux 正在无头模式下运行,我们是通过串行控制台来访问它的。
如果我们可以假设一些东西,那么就假定 Linux 已经启动并支持帧缓冲区。 (我已经好几年没有使用 Linux 帧缓存了,所以可能会有一些细节上的错误。) 通常会创建一个设备,可能是 /dev/fb/dev/fb0。打开这个文件,并在偏移处开始写入 RGB 值,屏幕将会改变,几乎不受任何限制:文本控制台,图形控制台,完整的桌面环境等。如果你想知道帧缓冲区支持是否正常工作,请在命令行上执行 dd if=/dev/zero of=/dev/fb,屏幕应该变成全黑。

14

C语言本身没有任何图形功能 - 您需要使用第三方库来实现它。


C是一种语言,本身没有真正的功能。也许你想说的是libc? - cdhowie
3
OP指定了Linux操作系统,这意味着你可以使用更多不仅仅是纯C语言的东西。 - R.. GitHub STOP HELPING ICE
6
第三方库将使用一些编程语言(可能是汇编语言),和/或操作系统和设备驱动程序的支持。从问题中可以看出,现在正在询问如何编写这样的第三方库。这个回答真是可惜了,比起一个部分有用的答案却获得了更多的赞。 - Mozan Sykol

6

在C语言中,您无法假设显示器。 您要求的事情实际上是不可能的。

编辑:好吧,您有一个显示器,但是同样,您无法从中获得太多信息。 关键是,对于图形显示,存在大量竞争标准,尽管其中一些(例如VGA接口)已经标准化,但许多其他标准(例如显示驱动程序接口)则没有标准化。 X(以及其他显示设备驱动程序,例如Windows或类似物)所做的很多工作是具有特定的接口代码,用于与显示驱动程序通信;它们抽象出了处理显示驱动程序的复杂性。 然而,窗口系统却拥有大量复杂且具体的代码库,用于处理显示驱动程序;这些东西相对透明是表明他们随着时间的推移已经投入了大量的工作。


你可以假设一下。我在笔记本电脑上从控制台运行Linux。 - DavidJFelix
下一步你会告诉我假设它是功能性的。 :) - Paul Sonier
1
那么请带我了解一下最基本的要求,以便我能够输出到屏幕。您可以假设您准确地解释了任何内容。 - DavidJFelix

5
非常原始,做了很多假设:
fd = open("/dev/fb0", O_RDWR);
lseek(fd, 640*y+x, SEEK_SET);
write(fd, "\377\377\377\377", 4);

实际上,你应该使用 mmap 而不是 write,并使用适当的 ioctl 查询屏幕模式,而不是假设为 640xHHH 32bpp。还有大小端问题等等。
因此,在真正的实践中,你可能会使用一些处理这种情况的库代码。

1

我想你可以将终端程序作为控制台来进行绘画。你所要做的就是找出你正在使用的终端程序,并查找相关信息。

哎呀,我假设你在使用终端了。:P


0

我认为你正在寻找有关如何写入帧缓冲区的信息。最简单的方法是使用SDL并将其渲染到帧缓冲区,或者使用GTK+与DirectFB,尽管这违反了你不使用工具包或框架的规定。


此外,它假定存在一个帧缓冲区。无头操作是完全正常的。 - Paul Sonier
4
McWafflestix:虽然严格来说是正确的,但我认为说你不能假设一个屏幕有点不诚实。���竟,如果没有某种显示器,这个问题就没有任何意义。 - Cercerilla
是的,这很啰嗦。但需要强调这一点,因为正是 OP 建议假设“什么都不知道”。 - dmckee --- ex-moderator kitten
并不是特别地迂腐。在地下室/壁橱中运行无头Apache服务器,并通过SSH进行远程管理,这甚至不算是不寻常的。大学的Unix设置已经成为了遥控无头设备数十年了。当您旧机器上的视频驱动程序死亡时,它并不是无用的;它可以变成一个FTP服务器。等等,等等。 - Paul Sonier
5
“@dmckee,@McWafflestix:叹气 人们用夸张的言辞,沟通是关于超越字面意思,理解对方意图并做出回应。指出无头系统等情况,而不添加任何有用信息,只会显得像教条主义者一样龟毛。” - Cercerilla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接