Màu của pixel


8

Viết chương trình in màu RGB của một pixel đã cho trên màn hình.

Chương trình nên đọc một dòng từ stdin theo định dạng x,y, trong đó x và y là các số nguyên không dấu. Pixel (0,0) là pixel trên cùng bên trái trong màn hình.

Sau đó, chương trình sẽ xuất một dòng thành thiết bị xuất chuẩn ở định dạng RRR,GGG,BBB, đại diện cho màu của pixel tại ( x, y).

RRR, GGGBBBphải là các số có dấu phẩy động trong khoảng từ 0 đến 1, các số nguyên OR trong phạm vi [0, 255]. Các số 0 đứng đầu không quan trọng, ví dụ: cả hai 07474đều được chấp nhận.

Hành vi không xác định

Chương trình có thể thể hiện hành vi không xác định (sự cố, đưa ra đầu ra không chính xác, v.v.) trong các điều kiện sau:

  • Người dùng nhập một chuỗi, số nguyên đã ký, float hoặc bất kỳ loại dữ liệu không hợp lệ nào khác
  • Đầu vào của người dùng không ở định dạng x,y
  • Pixel được chỉ định ở ngoài màn hình

Ghi chú:

  • Chương trình không thể sửa đổi pixel ở tọa độ đã cho.
  • Nếu bạn có nhiều màn hình, việc bật pixel trên màn hình là gì, miễn là cùng một màn hình được sử dụng mỗi khi chương trình chạy.

Câu trả lời với ít byte nhất sẽ thắng.


24
Tại sao nên RRR, GGGBBBlà các điểm nổi giữa 0 và 1? Thông thường chúng là số nguyên trong phạm vi [0,255]. Tôi sẽ đề nghị cho phép cả hai.
Kevin Cruijssen

4
Chúng ta có thể giới hạn các giải pháp của mình cho cửa sổ mà chúng đang được chạy, vì lợi ích của các ngôn ngữ không thể truy cập bất cứ thứ gì trên màn hình bên ngoài cửa sổ đó không?
Shaggy

7
Nếu bạn cho phép chỉ số là 0 - dạng 1 bạn không nên sử dụng RRR, GGGBBBtrong spec, nhưng R, G,B
sergiol

6
Nếu chúng ta có nhiều màn hình thì sao?
tsh

7
Có thể đáng để xác định rằng chương trình không thể sửa đổi pixel tại tọa độ đã cho. Nếu không, nó có thể hiệu quả hơn để bôi đen toàn bộ màn hình và quay trở lại 0, 0, 0, đánh bại mục đích của thử thách.
maxb

Câu trả lời:


10

Java 10 (hàm lambda), 105 75 byte

x->y->(new java.awt.Robot().getPixelColor(x,y)+"").replaceAll("[^\\d,]","")

Một hàm lấy hai tham số nguyên và trả về một Chuỗi RRR,GGG,BBB, trong đó các màu là các số nguyên trong phạm vi [0, 255].

-30 byte nhờ @LukeStevens bằng cách sử dụng đầu ra java.awt.Colormặc định của toString()nó và sửa đổi nó để chỉ còn lại các chữ số và dấu phẩy.

Giải trình:

x->y->                      // Method with two integer parameters and String return-type
  (new java.awt.Robot()     //  Create a AWT-Robot instance
    .getPixelColor(x,y)     //  Get the pixel AWT-Color at position x,y
    +"")                    //  Call the default toString() of the AWT-Color
                            //   i.e. "java.awt.Color[r=213,g=230,b=245]"
  .replaceAll("[^\\d,]","") //  Remove everything except for digits and commas

LƯU Ý: Việc toString()triển khai mặc định java.awt.Colorluôn luôn giống nhau trên các phiên bản JVM theo như tôi biết, nhưng có khả năng thay đổi trong tương lai. Tôi đã thử nghiệm nó trong cả Java 8 và Java 10 và nó đã trả về "java.awt.Color[r=#,g=#,b=#]".


Nhưng, kể từ khi thử thách nêu rõ:

  • Chương trình đầy đủ
  • Lấy đầu vào ở định dạng x,ytừ STDIN
  • Xuất ở định dạng R,G,Bsang STDOUT
  • R, G, Bnhư điểm nổi trong phạm vi[0.0, 1.0]

Mã trở nên RẤT NHIỀU hơn:

Java 10 (chương trình đầy đủ), 266 byte

interface M{static void main(String[]a)throws Exception{var s=new java.util.Scanner(System.in).next().split(",");var c=new java.awt.Robot().getPixelColor(new Short(s[0]),new Short(s[1]));System.out.print(c.getRed()/255d+","+c.getGreen()/255d+","+c.getBlue()/255d);}}

Giải trình:

interface M{          // Class
  static void main(String[]a)
                      //  Mandatory main method
    throws Exception{ //    Mandatory throws clause for `new Robot()`
  var s=new java.util.Scanner(System.in)
                      //   Create a Scanner for STDIN
         .next()      //   Get the String user input
         .split(","); //   Split it on "," and save it as String-array in `s`
  var c=new java.awt.Robot()
                      //   Create a AWT-Robot instance
         .getPixelColor(
                      //   And get the pixel AWT-Color at position:
           new Short( //    Convert String to Short (and implicitly to int):
            s[0]),    //     x-coordinate input by user from String-array `s`
           new Short( //    Convert String to Short (and implicitly to int):
            s[1]));   //     y-coordinate input by user from String-array `s`
  System.out.print(   //   Print to STDOUT:
   c.getRed()         //    The red part of RGB as integer in the range [0,255]
    /255d             //     Converted to a floating point in the range [0.0, 1.0]
   +","               //    Appended with a comma delimiter
   +c.getGreen()      //    Appended with the green part of RGB as integer in the range [0,255]
     /255d            //     Converted to a floating point in the range [0.0, 1.0]
   +","               //    Appended with a comma delimiter
   +c.getBlue()       //    Appended with the blue part of RGB as integer in the range [0,255]
     /255d);}}        //     Converted to a floating point in the range [0.0, 1.0]

2
Đối với câu trả lời đầu tiên, quy tắc lỏng lẻo, bạn có thể sử dụng chuyển đổi Chuỗi màu và chỉ cần có x->y->(new java.awt.Robot().getPixelColor(x,y)+"").replaceAll("[^\\d,]","")75 byte
Luke Stevens

@LukeStevens Sử dụng thông minh mặc định toString()của java.awt.Color. Cảm ơn!
Kevin Cruijssen

Các bạn làm tốt lắm, bạn đã đánh bại tôi: Tôi cũng đang bận rộn thực hiện toString()theo cách đó ... ;-) Ngoại trừ tôi phải tải xuống một IDE để làm tất cả những điều đó: Tôi chỉ sử dụng TIO ngay bây giờ :(
Olivier Grégoire

3
Lưu ý rằng Javadoc rất rõ ràng Color::toStringlà tùy ý triển khai. Vì vậy, có thể tốt khi chỉ định JVM nào đã được sử dụng cho các thử nghiệm (nó hoạt động như với OpenJDK và Oracle JDK).
Olivier Grégoire

1
Cuối cùng, bạn nên thay thế " "bằng ","để tuân thủ RRR,GGG,BBBđịnh dạng nghiêm ngặt (không RRR GGG BBB).
Olivier Grégoire

9

Mã máy 6502 (C64), 280 260 byte

00 C0 A2 00 20 CF FF C9 0D 9D 02 C1 F0 03 E8 D0 F3 20 D2 FF A5 7A 85 FB A5 7B
85 FC A9 01 85 7A A9 C1 85 7B 20 73 00 20 6B A9 A5 14 85 FD A5 15 85 FE 20 73
00 20 6B A9 A5 FB 85 7A A5 FC 85 7B A5 14 4A 4A 4A AA 20 F0 E9 A5 FD 46 FE 6A
4A 4A A8 A5 14 29 07 AA A9 00 38 6A CA 10 FC 85 FE B1 D1 0A 26 FC 0A 26 FC 0A
26 FC 85 FB A5 D2 29 03 09 D8 85 D2 B1 D1 85 02 A9 02 18 2D 18 D0 0A 0A 65 FC
29 0F 09 D0 85 FC A9 33 85 01 A5 FD 29 07 A8 B1 FB A2 37 86 01 25 FE D0 05 AD
21 D0 85 02 A6 D6 20 F0 E9 A5 02 29 0F AA BC D2 C0 20 BC C0 BC E2 C0 20 B7 C0
BC F2 C0 A9 2C 20 D2 FF 98 0A A9 30 90 02 A9 31 20 D2 FF A9 2E 20 D2 FF 98 29
7F 4C D2 FF 30 B0 35 35 36 33 32 39 36 33 38 33 35 37 34 37 30 B0 32 38 32 37
32 39 33 32 34 33 35 B0 34 37 30 B0 32 38 36 33 36 34 32 30 34 33 35 36 39 37

Tôi đã dự đoán điều này có thể xảy ra với số lượng byte ít hơn rất nhiều, nhưng thật không may ... tốt, vì tôi đã hoàn thành nó, dù sao thì nó cũng được đăng. Ít nhất, định dạng hạn chế đã giúp một điều: Một cái gì đó tương tự stdin(đầu vào từ thiết bị hiện tại) chỉ tồn tại trên C64 ở chế độ văn bản, vì HĐH chỉ hỗ trợ chế độ này - vì vậy không cần phải xem xét các chế độ khác của chip đồ họa .

Lưu ý về đầu ra của các giá trị màu: chip đồ họa C64 không sử dụng màu RGB mà trực tiếp tạo tín hiệu video với màu YUV, với bảng màu 16 màu cố định. Tôi đã sử dụng các giá trị làm tròn của chuyển đổi colodore sang RGB với cài đặt màn hình "mặc định" ở đây.

-20 byte : thói quen đầu ra tốt hơn, mã hóa đầu ra 3 ký tự cho mỗi kênh màu trong một byte đơn.

Về nhận xét: Về mặt lý thuyết, có thể sử dụng chế độ ký tự nhiều màu của VIC với HĐH C64, nhưng nó yêu cầu một phông chữ tùy chỉnh thực sự dễ đọc chỉ với 4 pixel chiều rộng gấp đôi. Không hoàn toàn không thể, nhưng rất khó xảy ra. Tương tự, chế độ màu mở rộng (hoặc chế độ nền mở rộng, giống nhau) có thể được sử dụng với HĐH C64, nhưng yêu cầu phải cấu hình lại trực tiếp chip đồ họa. Tôi chọn bỏ qua tất cả các khả năng này theo nghĩa chơi golf ở đây: Đây không phải là môi trường tiêu chuẩn bạn tìm thấy trên một chiếc Commodore 64 có hệ điều hành chứng khoán. Những gì có thể với hệ điều hành chứng khoán là chuyển đổi giữa hai phông chữ dựng sẵn (shift + khóa hàng hóa), chương trình thực hiện điều đó.

Bản demo trực tuyến

Cách sử dụng: SYS49152để bắt đầu.

Nhận xét tháo gỡ :

         00 C0       .WORD $C000        ; load address
.C:c000  A2 00       LDX #$00           ; loop index for input
.C:c002   .input:
.C:c002  20 CF FF    JSR $FFCF          ; character from input device
.C:c005  C9 0D       CMP #$0D           ; compare with enter
.C:c007  9D 16 C1    STA .buf,X         ; store to buffer
.C:c00a  F0 03       BEQ .parse         ; was enter -> start parsing
.C:c00c  E8          INX                ; next character
.C:c00d  D0 F3       BNE .input         ; and repeat input loop
.C:c00f   .parse:
.C:c00f  20 D2 FF    JSR $FFD2          ; output the enter character
.C:c012  A5 7A       LDA $7A            ; save pointer of BASIC parser
.C:c014  85 FB       STA $FB
.C:c016  A5 7B       LDA $7B
.C:c018  85 FC       STA $FC
.C:c01a  A9 15       LDA #$15           ; set pointer of BASIC parser to
.C:c01c  85 7A       STA $7A            ; buffer-1
.C:c01e  A9 C1       LDA #$C1
.C:c020  85 7B       STA $7B
.C:c022  20 73 00    JSR $0073          ; get next character
.C:c025  20 6B A9    JSR $A96B          ; BASIC routine to parse number
.C:c028  A5 14       LDA $14            ; lowbyte of parsed number to $fd
.C:c02a  85 FD       STA $FD
.C:c02c  A5 15       LDA $15            ; highbyte to $fe
.C:c02e  85 FE       STA $FE
.C:c030  20 73 00    JSR $0073          ; get next character
.C:c033  20 6B A9    JSR $A96B          ; parse as number ...
.C:c036  A5 FB       LDA $FB            ; restore pointer of BASIC parser
.C:c038  85 7A       STA $7A
.C:c03a  A5 FC       LDA $FC
.C:c03c  85 7B       STA $7B
.C:c03e  A5 14       LDA $14            ; load y coordinate
.C:c040  4A          LSR A              ; divide by 8 for character row
.C:c041  4A          LSR A
.C:c042  4A          LSR A
.C:c043  AA          TAX                ; -> to X
.C:c044  20 F0 E9    JSR $E9F0          ; set pointer to character row
.C:c047  A5 FD       LDA $FD            ; divide x coordinate by 8
.C:c049  46 FE       LSR $FE
.C:c04b  6A          ROR A
.C:c04c  4A          LSR A
.C:c04d  4A          LSR A
.C:c04e  A8          TAY                ; -> to Y
.C:c04f  A5 14       LDA $14            ; load y coordinate
.C:c051  29 07       AND #$07           ; mask pixel position in character
.C:c053  AA          TAX                ; -> to X
.C:c054  A9 00       LDA #$00           ; initialize pixel mask to 0
.C:c056  38          SEC                ; set carry for bit to shift in
.C:c057   .bitnum:
.C:c057  6A          ROR A              ; shift bit in mask
.C:c058  CA          DEX                ; and repeat until
.C:c059  10 FC       BPL .bitnum        ; in correct position
.C:c05b  85 FE       STA $FE            ; store pixel mask to $fe
.C:c05d  B1 D1       LDA ($D1),Y        ; load character code
.C:c05f  0A          ASL A              ; multiply by 8
.C:c060  26 FC       ROL $FC
.C:c062  0A          ASL A
.C:c063  26 FC       ROL $FC
.C:c065  0A          ASL A
.C:c066  26 FC       ROL $FC
.C:c068  85 FB       STA $FB            ; and store to $fb/$fc
.C:c06a  A5 D2       LDA $D2            ; move pointer to position in color RAM
.C:c06c  29 03       AND #$03
.C:c06e  09 D8       ORA #$D8
.C:c070  85 D2       STA $D2
.C:c072  B1 D1       LDA ($D1),Y        ; load color of character
.C:c074  85 02       STA $02            ; and store to $2
.C:c076  A9 02       LDA #$02           ; check which charset is active
.C:c078  18          CLC
.C:c079  2D 18 D0    AND $D018
.C:c07c  0A          ASL A              ; and calculate offset
.C:c07d  0A          ASL A
.C:c07e  65 FC       ADC $FC            ; add to (character code * 8)
.C:c080  29 0F       AND #$0F
.C:c082  09 D0       ORA #$D0           ; and add offset to character ROM
.C:c084  85 FC       STA $FC
.C:c086  A9 33       LDA #$33           ; bank in character ROM
.C:c088  85 01       STA $01
.C:c08a  A5 FD       LDA $FD            ; load y coordinate
.C:c08c  29 07       AND #$07           ; mask pixel-row number
.C:c08e  A8          TAY
.C:c08f  B1 FB       LDA ($FB),Y        ; load pixel row from character ROM
.C:c091  A2 37       LDX #$37           ; bank out character ROM
.C:c093  86 01       STX $01
.C:c095  25 FE       AND $FE            ; apply pixel mask
.C:c097  D0 05       BNE .pixelcol      ; not 0 -> pixel is set
.C:c099  AD 21 D0    LDA $D021          ; otherwise load background color
.C:c09c  85 02       STA $02            ; and store to $2
.C:c09e   .pixelcol:
.C:c09e  A6 D6       LDX $D6            ; restore screen row pointer for
.C:c0a0  20 F0 E9    JSR $E9F0          ; current cursor position
.C:c0a3  A5 02       LDA $02            ; load color
.C:c0a5  29 0F       AND #$0F           ; mask low nibble (only 16 colors)
.C:c0a7  AA          TAX                ; -> to X
.C:c0a8  BC D2 C0    LDY .red,X         ; load encoded output for red
.C:c0ab  20 BC C0    JSR .out2          ; call output without comma
.C:c0ae  BC E2 C0    LDY .green,X       ; load encoded output for green
.C:c0b1  20 B7 C0    JSR .out1          ; call output with comma
.C:c0b4  BC F2 C0    LDY .blue,X        ; load encoded output for blue
.C:c0b7   .out1:
.C:c0b7  A9 2C       LDA #$2C           ; load ","
.C:c0b9  20 D2 FF    JSR $FFD2          ; and output
.C:c0bc   .out2:
.C:c0bc  98          TYA                ; encoded output to A
.C:c0bd  0A          ASL A              ; shift top bit to carry
.C:c0be  A9 30       LDA #$30           ; load "0"
.C:c0c0  90 02       BCC .firstdig      ; carry clear -> to output
.C:c0c2  A9 31       LDA #$31           ; load "1"
.C:c0c4   .firstdig:
.C:c0c4  20 D2 FF    JSR $FFD2          ; and output
.C:c0c7  A9 2E       LDA #$2E           ; load "."
.C:c0c9  20 D2 FF    JSR $FFD2          ; and output
.C:c0cc  98          TYA                ; encoded output to A
.C:c0cd  29 7F       AND #$7F           ; mask out top bit
.C:c0cf  4C D2 FF    JMP $FFD2          ; to output and exit
.C:c0d2   .red:                                 ; encoded values for red
.C:c0d2  30 B0 35 35 .BYTE $30,$B0,$35,$35      ; ASCII digit ($30-$39) after
.C:c0d6  36 33 32 39 .BYTE $36,$33,$32,$39      ; decimal point, with bit 7
.C:c0da  36 33 38 33 .BYTE $36,$33,$38,$33      ; indicating 0 or 1 before
.C:c0de  35 37 34 37 .BYTE $35,$37,$34,$37      ; decimal point
.C:c0e2   .green:                               ; encoded values for green
.C:c0e2  30 B0 32 38 .BYTE $30,$B0,$32,$38      ; ...
.C:c0e6  32 37 32 39 .BYTE $32,$37,$32,$39
.C:c0ea  33 32 34 33 .BYTE $33,$32,$34,$33
.C:c0ee  35 B0 34 37 .BYTE $35,$B0,$34,$37
.C:c0f2   .blue:                                ; encoded values for blue
.C:c0f2  30 B0 32 38 .BYTE $30,$B0,$32,$38      ; ...
.C:c0f6  36 33 36 34 .BYTE $36,$33,$36,$34
.C:c0fa  32 30 34 33 .BYTE $32,$30,$34,$33
.C:c0fe  35 36 39 37 .BYTE $35,$36,$39,$37
.C:c102   .buf:                                 ; buffer for input ("stdin")

Điều này dường như không hỗ trợ chế độ nhiều màu .
nwellnhof

Tất nhiên là không, nó hoạt động với hệ điều hành gốc. Về mặt kỹ thuật, HĐH này hoạt động ở bất kỳ chế độ VIC nào, nhưng sẽ chỉ có rác trên màn hình, vì vậy nó không thể sử dụng được. Nhưng nhận xét của bạn khiến tôi nhớ "chế độ màu mở rộng", hoạt động khá tốt với hệ điều hành ... chết tiệt
Felix Palmen

@nwellnhof đã thêm một số lý do về nó, tôi hy vọng điều này là dễ chịu.
Felix Palmen

Làm cho người ta tự hỏi nếu viết điều này trong C sẽ ngắn hơn?

@Rogem có thể thử điều đó với cc65.. hoàn toàn có thể :) nhưng ít nhất, mã được biên dịch sẽ lớn hơn :)
Felix Palmen

6

TI-BASIC (TI-83/84 +), 22 byte

Vì màn hình có màu đen và trắng, chúng tôi chỉ cần kiểm tra xem pixel được chỉ định bật hay tắt và ánh xạ nó sang RGB đen hoặc trắng. Ngoài ra, các pixel chỉ có thể truy cập thông qua hàng và cột theo thứ tự đó, vì vậy đó là lý do tại sao tọa độ bị đảo ngược.

Prompt X,Y
255
Ans-{Ans,Ans,Ans}pxl-Test(Y,X

1
Lưu ý rằng điều này không hoạt động trên các máy tính TI màu (Giống như TI-84 Plus CE).
pizzapants184

Bạn có chắc chắn về số lượng byte? Tôi đếm 22.
lirtosiast

2

bash, 103/86 byte

Với cách giải thích chặt chẽ về thông số kỹ thuật (đầu vào từ STDIN và đầu ra trên STDOUT đều được phân tách bằng dấu phẩy):

read x
import -window root -crop 1x1+${x/,/+} ppm:-|od -dj13|awk 'NR<2{n=2^16;print$2/n","$3/n","$4/n}'

Với định dạng đầu vào lỏng hơn (đầu vào được phân tách cộng làm đối số dòng lệnh, đầu ra được phân tách bằng dấu cách:

import -window root -crop 1x1+$1 ppm:-|od -dj13|awk 'NR<2{n=2^16;print$2/n,$3/n,$4/n}'

Phụ thuộc vào hình ảnh, awk và coreutils.


2

Lắp ráp TI-Nspire - 112 byte

50 52 47 00 30 40 2D E9 FF FF FF FA 00 F0 17 F8
04 1C 00 F0 14 F8 85 00 2D 18 AD 01 2D 19 6C 00
C0 21 09 06 09 69 08 5B 3F 25 42 09 2A 40 1F 25
03 1C 2B 40 C1 0A 29 40 0A A0 0A DF 30 BD 00 20
0A 23 07 49 10 25 8A 69 2A 42 FC D1 0A 68 FF 25
2A 40 30 3A 0B DB 85 00 2D 18 6D 00 A8 18 F1 E7
00 00 02 90 25 64 2C 25 64 2C 25 64 0A 00 70 47

Chương trình này xuất ra các số nguyên trong phạm vi 0-31 cho R và B và 0-63 cho G, vì thiết bị thường sử dụng bộ đệm khung RGB565. Nó sử dụng nối tiếp cho đầu vào và đầu ra.

Nguồn:

.string "PRG"
push {r4, r5, lr}
blx main
.thumb
main:
@ read x and y from serial into r4 and r0
bl read_int
mov r4, r0
bl read_int

@ turn x and y into framebuffer offset
@ r4 = ((r0 * 320) + r4) * 2
lsl r5, r0, #2
add r5, r0
lsl r5, #6
add r5, r4
lsl r4, r5, #1

@ load pixel from framebuffer
@ r0 = ((uint16_t **)0xc0000000)[0x10][r4 / 2]
mov r1, #0xC0
lsl r1, #24
ldr r1, [r1, #0x10]
ldrh r0, [r1, r4]

@ unpack RGB565 value into r1, r2, r3
mov r5, #0x3f
lsr r2, r0, #5
and r2, r5
mov r5, #0x1f
mov r3, r0
and r3, r5
lsr r1, r0, #11
and r1, r5

@ call printf
adr r0, fmt
swi #10

@ return
pop {r4, r5, pc}

@ subroutine to read an integer from serial
read_int:
mov r0, #0
mov r3, #10
ldr r1, serial_base
@ loop until characters come in on serial
2:
mov r5, #(1<<4) 
1:
ldr r2, [r1, #0x18]
tst r2, r5
bne 1b
@ read character from serial and mask out status bits
ldr r2, [r1]
mov r5, #0xff
and r2, r5
@ subtract 48 ('0') from byte; if result is negative, return
sub r2, #48
blt 1f
@ multiply existing numbers by 10 and add new number to them
lsl r5, r0, #2
add r5, r0
lsl r5, #1
add r0, r5, r2
b 2b

serial_base:.word 0x90020000
fmt:.string "%d,%d,%d\n"
@ this instruction is over here because serial_base and fmt need to be word-aligned
1:bx lr

2

Bash trên Linux với xserver, 30 byte

xset dpms force off;echo 0,0,0

Sử dụng ý tưởng được trình bày trong nhận xét của tôi về câu hỏi, giải pháp này sẽ tắt hoàn toàn đầu ra màn hình và sau đó lặp lại rằng màn hình thực sự có màu đen.

Tôi cũng đã nghĩ đến việc sử dụng xbacklight =0, nhưng điều đó không làm thay đổi màu pixel.


+1 để tìm kẽ hở, nhưng tôi đã cập nhật các ràng buộc.
eeze

1

Thư viện Python 2 + PIL, 96 91 byte

import PIL.ImageGrab as i
print','.join('%.1f'%(x/255.)for x in i.grab().getpixel(input()))

Thực hiện các đặc điểm kỹ thuật theo nghĩa đen theo yêu cầu. Mặc dù chỉ có Windows - không hoạt động trên Linux và tạo thêm đầu ra (giá trị alpha) trên Mac.


from PIL import ImageGrab as ifrom PIL import*, i.grabImageGrab.grab.
Erik the Outgolfer

@Erik cái này không dành cho PIL. PIL chỉ nhập tên được liệt kê rõ ràng.
trứng

@ovs, Ah, đó có lẽ là vấn đề tại sao tôi cũng không thể làm cho __import__('...')cách làm việc.
Kirill L.

Lưu ý rằng điều này xuất ra một giá trị alpha trên macOS, vì vậy nó chỉ tuân thủ thông số kỹ thuật trên Windows.
trứng

@ovs, OK, tốt để biết, cảm ơn.
Kirill L.

1

Toán học, 69 byte

Chỉ cần chức năng là 34 byte.

CurrentScreenImage[]~PixelValue~#&

Đưa đầu vào ở dạng {x, y}.

Hình ảnh là sự hợp nhất của hình ảnh trên tất cả các màn hình. Nếu bạn muốn có một màn hình cụ thể, hãy sử dụng chỉ số nguyên - vd CurrentScreenImage[1]

Toàn bộ chương trình chính xác như được chỉ định là 69 Byte CurrentScreenImage[]~PixelValue~ToExpression["{"<>InputString[]<>"}"]


1

AutoHotKey, 113 byte

CoordMode,Pixel
InputBox,x
InputBox,y
PixelGetColor,c,x,y
MsgBox % c&255 . "," . c>>8&255 . "," . c>>16&255

Sử dụng hộp thoại thay vì stdin / stdout.



0

Bash + coreutils + Scrot + netpbm, 90 byte

scrot -e'pngtopnm $f'|(read a;read w h;read m;head -c$((3*(w*$2+$1)))>f;od -t u1 -N3 -An;)

Phiên bản I / O lỏng lẻo

Đưa xynhư các đối số dòng lệnh riêng biệt.

In r, g, bnhư ints 0-255 trên dòng riêng biệt


Bash + coreutils + Scrot + netpbm + bc + sed, 172 byte

IFS=, read x y
scrot -e'pngtopnm $f'|(read a;read w h;read m;head -c$((3*(w*$y+$x)))>f;od -vw1 -tu1 -N3 -An|while read p;do bc<<<"scale=2;$p/$m"|tr '\n' ,;done;)|sed s/,$//

Phiên bản I / O nghiêm ngặt

Đầu vào trên stdin như x,y

Đầu ra trên thiết bị xuất chuẩn như r.rr,g.gg,b.bb(không có dòng mới).


@Shaggy không còn nữa - xem các bản cập nhật
eeze

0

TI-BASIC (TI-83/84 +), 15 byte

Input Y
255not(rand(3)pxl-Test(Y,Ans

Lấy một số nguyên từ Ansvà một từ số nhắc. rand(3)tạo một danh sách gồm 3 số ngẫu nhiên khác nhau, vì vậy sản phẩm bằng 0 nếu pixel bị tố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.