2010-11-11 38 views
13

Làm cách nào để thay đổi pixel trên màn hình, trong C?Hiển thị pixel trên màn hình trong C

Giả sử NOTHING: Tôi đang sử dụng máy linux từ bảng điều khiển để thực hiện việc này. Tôi không muốn sử dụng bộ công cụ hoặc khung công tác GUI để vẽ pixel. Tôi không muốn vẽ điểm ảnh trong cửa sổ. Tôi muốn vẽ điểm ảnh trực tiếp lên màn hình.

EDIT: Tôi có một màn hình. Tôi đang trên một máy tính xách tay chạy Linux từ giao diện điều khiển. Tôi muốn một giải pháp không sử dụng X như tôi muốn tìm hiểu cách X hoạt động hơn cách sử dụng X.

Nếu có thêm thông tin, hãy hỏi, nhưng đừng giả sử. Tôi không cố gắng xây dựng một GUI, và đó là mục đích chính của việc ngăn chặn các giả định như tôi không muốn mọi người cho rằng tôi đang làm mọi thứ theo một chặng đường dài trong thực tế, tôi chỉ đang làm leng keng.

CHỈNH SỬA 2: Bạn có thể sử dụng bất kỳ thư viện liên quan đến X11 nào miễn là bạn có thể giải thích cách chúng hoạt động.

+1

Được rồi, tôi giả sử bạn Kos đúng. Tôi chỉ không muốn mọi người giả định rằng tôi muốn đi theo con đường dài chỉ để tạo ra một GUI mà không có bộ công cụ khi trong thực tế tôi muốn tìm hiểu về cách hiển thị hoạt động. – DavidJFelix

+2

Nếu chúng ta không thể giả định bất cứ điều gì, tôi không thể giả định câu hỏi bằng tiếng Anh, thậm chí là các ký tự được hiển thị mô tả câu hỏi có bất kỳ mối quan hệ nào với các ký tự mà OP đã nhập. OK, đó là ngớ ngẩn nhưng nó là một trong những thú cưng của tôi peeves mà mọi người nói "không có gì!" trong thực tế, họ chỉ có nghĩa là có một vài giả định cơ bản mà họ muốn loại bỏ. – LarsH

+0

Đó là một trong những thú cưng của tôi khi mọi người đưa ra giả định. :) – DavidJFelix

Trả lời

10

Nếu chúng ta thực sự không có gì, chúng ta có thể giả định rằng X đang chạy không? Đối với vấn đề đó, chúng ta có thể giả định rằng có một card màn hình không? Có lẽ Linux đang chạy không đầu và chúng tôi đang truy cập nó trên một giao diện điều khiển nối tiếp.

Nếu chúng tôi được phép giả định một vài điều, hãy giả sử rằng Linux đã khởi động với bộ phận hỗ trợ bộ đệm khung. (Đã một vài năm kể từ khi tôi làm việc với bộ đệm khung của Linux, tôi có thể nhận được một số chi tiết sai.) Sẽ có một thiết bị được tạo, có thể là /dev/fb hoặc /dev/fb0. Mở tập tin đó và bắt đầu viết các giá trị RGB tại một offset, và màn hình sẽ thay đổi, khá nhiều bất kể bất cứ điều gì: bảng điều khiển văn bản, giao diện đồ họa, envrionment máy tính chính thức, v.v. Nếu bạn muốn xem hỗ trợ framebuffer có hoạt động hay không dd if=/dev/zero of=/dev/fb trên dòng lệnh và màn hình sẽ chuyển sang màu đen.

+1

'/ dev/urandom' hoặc' ~/naughty.pnm' thú vị hơn '/ dev/zero' ... –

+0

Đã kiểm tra. Màn hình chuyển sang màu đen. – DavidJFelix

+0

Có an toàn không? – Abdillah

13

C không có bất kỳ khả năng đồ họa nào - bạn cần phải sử dụng thư viện của bên thứ ba cho việc này.

+0

C là ngôn ngữ và không có khả năng * thực *. Có lẽ bạn muốn nói libc? – cdhowie

+2

OP được chỉ định Linux. Điều đó có nghĩa là bạn có nhiều hơn đồng bằng C. –

+4

Thư viện của bên thứ ba sẽ sử dụng một số ngôn ngữ lập trình (có thể là Assembly), AND/OR hỗ trợ từ hệ điều hành và trình điều khiển thiết bị. Rõ ràng từ câu hỏi rằng làm thế nào để viết một thư viện của bên thứ ba là những gì đang được hỏi ở đây. Thật không may rằng rác này được nhiều upvotes hơn một câu trả lời hữu ích một phần. –

6

Bạn không thể giả định hiển thị trong C. Không có cách nào để thực hiện những gì bạn yêu cầu.

Chỉnh sửa: OK, bạn có màn hình, nhưng một lần nữa, không có nhiều thứ bạn có thể nhận được từ đó. Vấn đề là có một TON các tiêu chuẩn cạnh tranh cho màn hình đồ họa, và trong khi một số trong số đó (giao diện VGA, ví dụ) được tiêu chuẩn hóa, rất nhiều người khác (giao diện trình điều khiển màn hình, ví dụ) là KHÔNG. Phần lớn những gì X (và các trình điều khiển thiết bị hiển thị khác, chẳng hạn như Windows hoặc tương tự) làm, có mã giao diện cụ thể để biết cách nói chuyện với các trình điều khiển hiển thị; chúng trừu tượng hóa sự phức tạp của việc xử lý các trình điều khiển hiển thị. Các hệ thống cửa sổ, mặc dù, có các thư viện HUGE mã phức tạp và cụ thể để xử lý các trình điều khiển hiển thị; thực tế là những điều này là tương đối minh bạch là một dấu hiệu của chỉ có bao nhiêu công việc họ đã đưa vào những điều này theo thời gian.

+0

Bạn được phép giả định điều đó. Tôi đang chạy Linux từ giao diện điều khiển trên một máy tính xách tay. – DavidJFelix

+0

Điều tiếp theo bạn biết, bạn sẽ nói với tôi giả sử nó hoạt động. :) –

+1

Sau đó, hãy hướng dẫn tôi qua các yêu cầu tối thiểu về cách tôi muốn xuất ra màn hình. Bạn có thể giả định bất cứ điều gì mà bạn giải thích chính xác. – DavidJFelix

0

Tôi nghĩ rằng những gì bạn đang tìm kiếm là thông tin về cách ghi vào bộ đệm khung. Cách dễ nhất là sử dụng SDL và kết xuất với bộ đệm khung, hoặc sử dụng GTK + với DirectFB, mặc dù điều đó đi ngược lại nguyên tắc của bạn về việc không sử dụng bộ công cụ hoặc khung công tác.

+0

Ngoài ra, nó giả định có một framebuffer. Hoạt động không đầu là hoàn toàn bình thường. –

+3

McWafflestix: Mặc dù về mặt đạo đức, tôi nghĩ rằng có một chút bất tiện khi nói rằng bạn không thể giả sử một màn hình. Sau khi tất cả, mà không có một màn hình hiển thị của một số loại câu hỏi không làm cho bất kỳ loại ý nghĩa. – Cercerilla

+0

Vâng, đó là hình ảnh. Nhưng điểm cần phải được thực hiện mạnh mẽ, bởi vì nó là OP người đề xuất giả định "NOTHING". – dmckee

5

Rất nguyên thủy và làm cho rất nhiều giả định:

fd = open("/dev/fb0", O_RDWR); 
lseek(fd, 640*y+x, SEEK_SET); 
write(fd, "\377\377\377\377", 4); 

Trong thực tế, bạn sẽ sử dụng mmap hơn write, và sử dụng thích hợp ioctl để truy vấn chế độ màn hình chứ không phải là giả 640xHHH 32bpp. Ngoài ra còn có các vấn đề cuối cùng, v.v.

Vì vậy, trong thực tế thực tế, bạn có thể sử dụng một số loại mã thư viện để xử lý loại điều này cho bạn.

1

Tôi cho rằng bạn có thể vẽ lên chương trình đầu cuối mà bạn đang sử dụng làm bảng điều khiển của mình. Tất cả những gì bạn phải làm là tìm hiểu xem cái nào là và tìm kiếm nó.

Rất tiếc, tôi giả định thiết bị đầu cuối. : P

+0

Xem thêm: ['aalib'] (http://aa-project.sourceforge.net/). – dmckee

-3

Người bạn thân nhất của bạn sẽ là printf. Về cơ bản lưới in với một số biểu tượng (chẳng hạn như '.') Sẽ có nghĩa là tất cả các điểm ảnh trên. Và lưới in với ký tự khoảng trắng (chẳng hạn như '') có nghĩa là tất cả các pixel đều bị tắt. Ví dụ đây là cách chúng ta có thể rút ra sine() chức năng trong dòng sản lượng đồng bằng:

#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; 
} 

nào sẽ tạo ra sản lượng như:

0,0|                 X 
--------------------------------------------------------------------------> 
    |  **   **   **   **   ** 
    |  * *   * *   * *   * *   * * 
    | 
    | *    *    *    *    * 
    |   *    *    *    *    * 
    | 
    | *    *    *    *    * 
    |   *    *    *    *    * 
    | 
    | *    *    *    *    * 
    |   *    *    *    *    * 
    | 
    | *   * *   * *   * *   * *   * 
    |*   **   **   **   **   ** 
    | 
    Y| 
    | 
    v 
Các vấn đề liên quan