在C中显示屏幕上的像素

时间:2010-11-11 18:32:13

标签: c graphics

如何在C?

中更改显示屏上的像素

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

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

如果有更多信息,请询问,但不要假设。我不打算构建一个GUI,这是阻止假设的主要目的,因为我不希望人们认为我在做很长的事情,而实际上我只是在修补。

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

7 个答案:

答案 0 :(得分:13)

C没有任何图形功能 - 您需要使用第三方库。

答案 1 :(得分:12)

如果我们真的没有假设,我们甚至可以假设X正在运行吗?就此而言,我们甚至可以假设有一个视频卡吗?也许Linux运行无头,我们通过串行控制台访问它。

如果允许我们假设一些事情,那么我们假设Linux已经启动了framebuffer支持。 (自从我使用Linux framebuffers以来已经过了几年,我可能会错误地了解一些细节。)将会创建一个设备,可能是/dev/fb/dev/fb0。打开该文件并开始在偏移量处写入RGB值,屏幕将发生变化,几乎无论如何:文本控制台,图形控制台,成熟的桌面环境等。如果您想查看帧缓冲支持是否有效,请执行此操作命令行上显示dd if=/dev/zero of=/dev/fb,显示应该全黑。

答案 2 :(得分:6)

你不能假设在C中显示。实际上没有办法做你所要求的。

编辑:好的,你有一个显示器,但同样,你可以从那里获得很多东西。重点是图形显示有一些竞争标准,虽然其中一些(例如VGA接口)是标准化的,但其他很多(例如显示驱动程序接口)都不是。 X(以及其他显示设备驱动程序,例如Windows等)所做的大部分都具有用于如何与显示驱动程序通信的特定接口代码;他们抽象出处理显示驱动程序的复杂性。然而,窗口系统具有巨大的复杂和特定代码库,用于处理显示驱动程序;这些东西相对透明的事实表明他们随着时间的推移已经投入了多少工作。

答案 3 :(得分: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。还有端序问题等。

所以在现实中,你可能会使用某种类型的库代码来处理这类事情。

答案 4 :(得分:1)

我想你可以绘制到你用作控制台的终端程序。你所要做的就是找出哪一个是查找的。

哎呀我假设了一个终端。 :P

答案 5 :(得分:0)

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

答案 6 :(得分:-3)

你最好的朋友将是printf。基本上印有一些符号的网格(例如'。')表示所有像素都在上面。带有空格字符的打印网格(例如'')表示所有像素都关闭。 例如,这就是我们如何在普通输出流中绘制sine()函数:

#include <stdio.h>

#define MAXY 20
#define MAXX 75
static char display[MAXY][MAXX];

void setGraph(void) {
    memset(display, ' ', sizeof(display));

    int i;
    // draw Y axis
    for (i=0; i < MAXY; i++)
      display[i][3] = '|';
    // draw X axis
    for (i=0; i < MAXX; i++)
      display[1][i] = '-';
    // draw origin
    display[0][0] = '0';
    display[0][1] = ',';
    display[0][2] = '0';
    // draw arrows
    display[1][MAXX-1] = '>';
    display[MAXY-1][3] = 'v';
    // draw labels
    display[0][MAXX-3] = 'X';
    display[MAXY-3][2] = 'Y';
}

void plotSine() {
    int i;
    int y;
    for (i=4; i < MAXX; i++) {
        y = 2 + (int)7.0*(1.0 + sin(0.45*(float)i));
        display[y][i] = '.';
    }
}

void drawDisplay(void) {
    int x,y;
    for (x=0; x < MAXY; x++) {
      for (y=0; y < MAXX; y++) {
        printf("%c", display[x][y]);
      }
      printf("\n");
    }
}

int main () {
    setGraph();
    plotSine();
    drawDisplay();
    return 0;
}

哪会产生这样的输出:

0,0|                                                                    X
-------------------------------------------------------------------------->
   |      **            **            **            **            **
   |     *  *          *  *          *  *          *  *          *  *
   |
   |    *             *             *             *             *
   |         *             *             *             *             *
   |
   |   *             *             *             *             *
   |          *             *             *             *             *
   |
   |  *             *             *             *             *
   |           *             *             *             *             *
   |
   | *          *  *          *  *          *  *          *  *          *
   |*            **            **            **            **            **
   |
  Y|
   |
   v