Có thể truy cập vào bộ đệm khung để đặt pixel trên màn hình từ dòng lệnh không?


15

Tôi không chắc liệu đó có phải là cách duy nhất có thể không, nhưng tôi đọc rằng để đặt một pixel lên màn hình tại một vị trí bạn chọn, người ta phải viết một cái gì đó vào một nơi gọi là bộ đệm khung. Vì vậy, tôi trở nên tò mò, nếu có thể vào nơi này và viết một cái gì đó vào đó để hiển thị một pixel ở đâu đó trên màn hình.


Bạn đã không chỉ định hệ điều hành nào. Linux?
Gilles 'SO- ngừng trở nên xấu xa'

Có, Linux (tên mã là rebecca)
Abdul Al Hazred

Câu trả lời:


15

có, bên ngoài máy chủ X, trong tty, hãy thử lệnh:

cat /dev/urandom >/dev/fb0

nếu các pixel colourfull lấp đầy màn hình, thì thiết lập của bạn vẫn ổn và bạn có thể thử chơi với tập lệnh nhỏ này:

#!/usr/bin/env bash

fbdev=/dev/fb0 ;   width=1280 ; bpp=4
color="\x00\x00\xFF\x00" #red colored

function pixel()
{  xx=$1 ; yy=$2
   printf "$color" | dd bs=$bpp seek=$(($yy * $width + $xx)) \
                        of=$fbdev &>/dev/null
}
x=0 ; y=0 ; clear
for i in {1..500}; do
   pixel $((x++)) $((y++))
done

trong đó hàm 'pixel' phải là câu trả lời ... ghi pixel lên màn hình bằng cách thay đổi giá trị byte (blue-green-red-alpha) trên xy offset của thiết bị / dev / fbX là bộ đệm khung cho card màn hình.

hoặc thử vẽ một pixel pixel (màu vàng trên x: y = 200: 100, nếu chiều rộng là 1024):

printf "\x00\xFF\xFF\x00" | dd bs=4 seek=$((100 * 1024 + 200)) >/dev/fb0

CẬP NHẬT: mã này hoạt động ngay cả trong máy chủ X, nếu chúng ta chỉ cấu hình X để sử dụng bộ đệm khung . bằng cách chỉ định fb0 bên trong /usr/share/X11/xorg.conf.d/99-fbdev.conf


Có một vài điều nguy hiểm đang diễn ra ở đây: ví dụ đầu tiên xuất hiện để ghi các byte ngẫu nhiên vào đĩa mềm, vì một số lý do. Các lệnh tiếp theo sử dụng ddthường được gọi là "Phá hủy đĩa" vì những lý do cụ thể ... đừng đến gần các lệnh này trừ khi bạn biết bạn đang làm gì ...
robert

4
@robert Tôi nghĩ Omar có nghĩa /dev/fbX/dev/fdđó chỉ là một lỗi đánh máy. Và vâng, ddnguy hiểm nhưng cũng vậy rm. Điều đó không có nghĩa là nó không nên được sử dụng. Nó chỉ có nghĩa là nó nên được sử dụng cẩn thận.
terdon

ah /dev/fb0có ý nghĩa hơn! Mọi người đều biết những gì rmcó nghĩa là, nhưng ddtối nghĩa hơn một chút, vẫn nghĩ rằng nó nên mang một cảnh báo sức khỏe.
robert

2
"có, bên ngoài máy chủ X, trong tty, hãy thử lệnh:" Tôi không hiểu nếu tôi hiểu đúng, vì vậy tôi đã thử mở thiết bị đầu cuối và viết "cat / dev / urandom> / dev / fd0" nhưng tôi chỉ nhận được một thông báo lỗi: "cat: write error: không còn chỗ trống trên thiết bị". Tôi thực sự không biết làm thế nào để thoát khỏi xserver.
Abdul Al Hazred

1
... tôi gọi nó là tty, nhưng nó là bàn điều khiển ảo, không phải gui, thiết bị đầu cuối trên tất cả màn hình, mà bạn đạt được với ctrl-alt-f1,2,3 ... hoặc "sudo chvt 1" ... ' không còn chỗ trống 'có vẻ như sẽ ổn, chỉ cần bạn vẫn ở trong phiên X.
Asain Kujovic

0

Tôi vừa đăng sáng nay, vẫn đang điều tra lý do tại sao nó chỉ hoạt động trên Raspberry Pis. https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=213964&p=1428891#p1428891

Mở / dev / fb0, mmap nó để bạn có được một con trỏ và nó nhanh hơn nhiều. Không sử dụng X chút nào nhưng nó sẽ vui vẻ bỏ qua X, nó chỉ là một cái gì đó trên màn hình.

Ồ, từ một dòng lệnh, sắp xếp, bạn có thể ghi vào / dev / fb0. Nhưng bất cứ điều gì bạn viết ở offset 0 sẽ nằm ở góc trên bên trái để nó sẽ ngay lập tức cuộn ra khỏi màn hình. Bạn có thể thực hiện một vòng lặp for Bash và viết vài nghìn lần. Hoặc sử dụng / dev / urandom. Phá hủy những gì trong bộ lọc màn hình, đặc biệt là khi bạn ở X, không phải là vấn đề lớn. Ngay khi bạn kéo một cửa sổ trên khu vực X sẽ gây ra sự kiện phơi bày và sơn lại nó. Bạn không cần phải giết sức mạnh để phục hồi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.