Diberikan gambar, baik sebagai input (mungkin dalam RGB triplets) atau dengan nama file sebagai input (Anda dapat menganggap gambar memiliki nama file tertentu, mungkin tanpa ekstensi), menampilkan gambar yang mewakili saluran warna tunggal dari gambar.
Anda juga akan mengambil input lain, mewakili saluran mana yang akan di-output. Input dapat berupa salah satu dari 3 simbol berbeda. Namun, simbol harus berupa string atau angka. Anda tidak dapat mengambil matrik untuk diterapkan ke array sebagai input. (seperti {1, 0, 0}
, atau {0, 1, 0}
).
Anda akan menampilkan <input>
saluran gambar input. Anda bisa menyimpannya ke file atau output satu set pasangan RGB.
Program Anda seharusnya tidak memiliki batasan pada ukuran gambar (dalam px), dan harus mendukung .png
, .jpg
/ .jpeg
/ .JPG
, atau triplet RGB sebagai format gambar. (namun dapat mendukung sebanyak yang Anda inginkan)
Kasus cobaan:
Jalur Merah:
Jalur Hijau:
Saluran biru:
Dan satu lagi test case, seluruhnya merah. Foto asli , merah , hijau , dan biru . (peringatan: saluran polos dan merah terlalu menyakitkan untuk dilihat terlalu lama)
2 kasus uji lagi:
Dua test case terakhir berasal dari Images dengan semua warna .
Jawaban:
APL (Dyalog) , 7 byte
I / O: array kembar tiga RGB
Cobalah online!
⍳3
tiga bilangan bulat pertama⎕=
bandingkan input numerik (saluran yang dipilih) dengan itu⊂
terlampir (sehingga setiap triplet gambar memasangkan seluruh triplet ini)⎕×
mengalikan input numerik (array triplet) dengan itusumber
JavaScript (ES6), 29 byte
Input adalah array 2D bilangan bulat 24-bit (mis.
[[0x0000ff,0x00ff00],[0xff0000,0xffffff]]
) Dan16711680
untuk merah,65280
untuk hijau,255
untuk biru. Jika ini tidak valid, coba ini sebagai gantinya:JavaScript (ES6), 48 byte
Input adalah array 3D dari nilai warna dan
0
untuk merah,1
untuk hijau,2
untuk biru.sumber
Mathematica, 13 byte
Ini harus menjadi versi sah dari jawaban JungHwan Min. Fungsi ini mengambil gambar dan satu dari
Red
,Green
,Blue
sebagai masukan. Sebagai contoh:Sebagai fakta yang menyenangkan, ada juga
ColorSeparate
yang memberi Anda saluran tersendiri, tetapi mengembalikannya sebagai gambar saluran tunggal / skala abu-abu, jadi Anda harus mengalikannya dengan warna setelahnya.sumber
Bash + ImageMagick,
353227 byteMengasumsikan gambar ada dalam file
i
dan skrip mengambil salah satunyaRG
,BG
,BR
untuk biru, merah, dan hijau masing-masing; output ke filei
.sumber
Spectrum , noncompeting, 1 byte
(Non-bersaing karena tantangan ini menginspirasi bahasa ini.) Pada kenyataannya, Spectrum adalah pustaka npm dengan antarmuka bahasa untuk perintah.
Mengambil input sebagai:
Panggil program sebagai:
Atau, Anda dapat memberikan informasi ke petunjuk:
Ini meninggalkan gambar di tumpukan. Untuk melihatnya, tambahkan
O
di bagian akhir, seperti:Untuk kesenangan ekstra, cobalah
echo filename | node spectrum.js "wO"
. Ia melakukan ketiga isolasi saluran sekaligus:sumber
n[d1=`[d1-P*][],.g!]#Pdd1-P~%-1=p
JavaScript (ES6), 29 byte
Sangat mirip dengan jawaban ETHproductions tetapi dengan input yang lebih fleksibel daripada metode pertama dan lebih kecil dari yang kedua.
Ini mendefinisikan fungsi yang menerima gambar sebagai array 1 dimensi dari intensitas warna numerik. Fungsi ini kemudian mengembalikan fungsi lain yang menerima nilai integer yang mewakili saluran warna yang diinginkan.
Warna dapat diwakili oleh rentang angka apa pun selama 0 menunjukkan tidak adanya warna sama sekali. Misalnya
0.0 - 1.0
atau0 - 255
Contoh:
Jika data gambar dalam format RGB maka memanggil fungsi dengan argumen
(imageData)(0)
akan mengembalikan gambar hanya dengan saluran merah.Jika data gambar dalam format BGR maka memanggil fungsi dengan argumen
(imageData)(2)
juga akan mengembalikan gambar hanya dengan saluran merah.sumber
i%3==b&&v
juga berhasil.Python 2, 69 byte
Masih bermain golf.
Mengambil input sebagai
filename, n
(di manan
0, 1, atau 2). Menyimpan gambar baru dari yang lama.0
berwarna hijau,1
merah, dan2
biru. Berkat @ovs, @Mikhail, dan @Rod untuk byte mati.sumber
k[:,:,x[i][0]]=k[:,:,x[i][1]]=0
dengank[:,:,[1,2,0][i]]=k[:,:,i]=0
from cv2 import*
untuk menyimpan beberapa bytek[:,:,i-1]=k[:,:,i]=0
dengank[:,:,[i,i-1]]=0
CJam , 12 byte
Blok anonim yang mengharapkan array 3D triplet RGB dan angka antara 0 dan 2 inklusif pada tumpukan. Meninggalkan array yang diekstrak pada stack sesudahnya.
Mungkin bisa bermain golf dengan menggunakan format input yang aneh, tapi saya merasa seperti itu sedikit curang.
Cobalah online!
Tempat uji dibuat hanya untuk menunjukkan, menggunakan kembar tiga dari gambar yang sebenarnya akan terlalu besar.
Penjelasan
sumber
PowerShell , 282 byte
Tak satu pun dari ini suka "golf input" atau "menggunakan built-in." Phooey tentang itu. ;-)
Ini di sini mengambil path lengkap dari input PNG (meskipun, sebenarnya, tidak perlu menjadi PNG, karena JPG, BMP, dll didukung oleh .NET, tapi saya baru mencobanya di PNG), dan salah satu
(R, G, B)
untuk saluran warna, lalu menyimpannya ke dalam$x
dan$y
. Kami kemudian membuatNew-Object
tipeSystem.Drawing.Bitmap
dari$x
dan menyimpan ke dalam$a
.Lalu kami melakukan loop ganda pada semua piksel. Pertama dari
1
hingga$a
's.Height
, pengaturan$h
setiap iterasi (itu nol-diindeks, sehingga ini mengapa kita--$_
, yang menyimpan byte lebih( .height-1)
. Di dalam, kita loop dari1
hingga$a
' s.Width
.Setiap iterasi, kami melakukan a
.GetPixel
padaw,h
koordinat tertentu , yang mengembalikanSystem.Drawing.Color
objek. Kamiselect
mengeluarkanR G B
nilainya. Diiex
sini adalah trik rapi yang mengubah ini menjadi hashtable (misalnya, sesuatu seperti@{R=34; G=177; B=76}
) sehingga kita dapat mengindeks langsung dengan saluran warna yang diinginkan[$y]
. Nilai itu disimpan ke dalam$i
.Selanjutnya, kami menetapkan tiga nilai
$r, $g, $b
menjadi hasil dari beberapa operator pseudo-ternary berdasarkan nilai huruf$y
. Jadi, misalnya, jika$y
adalahR
, maka hasil di sini adalah$r=$i, $g=0, $b=0
.Kemudian, kita lakukan
.SetPixel
kembali kew,h
koordinat tertentu itu , membangun yang baruSystem.Drawing.Color
menggunakan statisFromARGB
(yang menganggap alpha sepenuhnya buram). Setelah kita selesai mengulang, kita cukup.Save
dengan PNG ke file baru.Catatan: Ini memang memakan waktu lama, karena benar-benar secara independen perulangan melalui setiap piksel dan melakukan banyak perhitungan dan memanggil setiap iterasi.
Tes:
sumber
Bash + ImageMagick, 41 byte
Input adalah file bernama
x
, salah satu parameter baris perintahR
atauG
atauB
Output menimpa file input
Berbeda dari jawaban betseg dalam mengambil lebih banyak parameter saluran satu huruf. Juga menimpa alih-alih menghasilkan file baru yang betseg bebas untuk mencuri :)
sumber
$1
membutuhkan tanda kutip, nama file dapat memiliki ruangx
selama 1 byte.Chip , 78 byte
Cobalah online!
Chip adalah bahasa 2D yang beroperasi pada bit komponen setiap byte dalam aliran byte.
Ikhtisar
Solusi khusus ini mengharapkan byte pertama input menjadi karakter kontrol - untuk menentukan saluran mana yang harus disimpan - dan berikut ini adalah byte dari data gambar. Data gambar harus berupa triplet RGB, satu byte per saluran, 24 bit per piksel:
Karakter kontrol ditafsirkan sebagai bidang bit, meskipun hanya tiga bit terendah yang memiliki arti:
Ini berarti kita dapat menggunakan karakter ASCII untuk memilih saluran mana yang kita inginkan:
1
berarti merah2
berarti biru4
berarti hijauAtau lakukan sesuatu yang lebih menarik:
5
tetap merah dan biru, tetapi tidak hijau7
menyimpan semua saluran (gambar tidak berubah)0
jatuhkan semua saluran (gambar hitam)Bagaimana itu bekerja
Solusi ini agak campur aduk karena golf, tetapi begini:
C
,B
, danA
, dan menyimpan mereka bit dalam mereka sesuaiM
sel Emory. Juga,S
tekan output untuk siklus pertama./
switch untuk output byte input saat ini, jika tidak aktif, buka switch sehingga kami menghasilkan byte nol.Melihat hasilnya
Tentu, Anda bisa menggunakan hexdump atau sesuatu yang membosankan, tetapi ternyata ini adalah (hampir) format gambar yang sebenarnya valid: binary Portable PixMap .
Cukup colokkan data gambar dari atas (minus byte kontrol, tentu saja) ke dalam file di bawah ini, sesuaikan lebar / tinggi agar valid, dan Anda dapat melihat gambar dalam penampil yang tepat seperti IrfanView, meskipun yang lebih sederhana (seperti kebanyakan browser) built-in) tidak bisa mengatasinya.
Misalnya (menggunakan escapes untuk data mentah):
sumber
MATL,
2113 byteSaluran warna harus ditentukan dengan menggunakan pemetaan berikut:
1:red
,2:green
,3:blue
Interpreter online tidak dapat digunakan
imread
untuk membaca gambar jadi di sini adalah versi yang sedikit dimodifikasi di mana saya telah mengkodekan gambar acak ke dalam sumber .Penjelasan
sumber
05AB1E , 16 byte
Cobalah online!
Menggunakan warna hex dalam format array 2D dan [0,1,2] untuk setiap saluran.
sumber
Clojure,
421332 byte-89 bytes dengan agresif menguraikan semuanya, berubah dari metode lama saya yang menggelikan saluran, dan menyingkirkan impor kebetulan yang tidak perlu.
Memukul ini setengah jam sebelum shift saya mulai tanpa tahu apa yang saya lakukan. Saya memiliki sedikit pengalaman
BufferedImage
, jadi mungkin ada cara yang lebih baik untuk melakukan hal ini. Saya juga menyalahgunakanColor
untuk mengonversi bolak-balik antara representasi warna saluran dan integer.Ini sangat besar dibandingkan dengan jawaban lain karena beberapa alasan (selain itu jelas bahwa Clojure bukan bahasa golf):
Alih-alih hanya memanipulasi array byte, ini sebenarnya mengambil input gambar, mengubahnya, dan output itu.
Saya menggunakan Java-interop, yang sementara berguna bisa sangat bertele-tele. Impor saja lebih besar dari banyak jawaban.
Lihat kode di bawah ini untuk rinciannya.
sumber
Lua (love2d Framework), 498 byte
Saya melakukan ini lebih sebagai latihan untuk diri saya sendiri, jadi ini tidak sesingkat mungkin (walaupun saya memang mencoba bermain golf), tetapi saya ingin menambahkannya ke sini karena saya pikir saya melakukan yang baik. Bahkan jika saya terlambat.
Di sini kode golf, di bawahnya adalah versi yang dijelaskan dan tidak terurai.
Berikut adalah kode yang harus dimasukkan dalam file * .jpg. Setelah gambar dimasukkan, Anda dapat menekan tombol angka untuk saluran merah (1) hijau (2) atau biru (3). Juga untuk melihat gambar default lagi tekan 0. Sebenarnya itu hanya menampilkan gambar di jendela.
Bagian penting yang melakukan semua pekerjaan adalah shader yang merupakan deklarasi string kecil di awal atau tidak terurai:
yang mendapatkan piksel sebenarnya dari gambar dan hanya menampilkan saluran yang diperlukan.
Gambar pengujian saya dan output yang berbeda untuk saluran (juga pasti yang lain)
sumber
C,
6058 byteInput gambar adalah daftar angka (dalam desimal) antara 0 dan 255 aktif
stdin
, misalnyaSaluran ditentukan sebagai argumen pertama ke program, dan merupakan salah satu
Contoh:
sumber