แยกช่องสัญญาณ RGB ของภาพ


22

เมื่อกำหนดรูปภาพไม่ว่าจะเป็นอินพุต (อาจเป็นแบบ RGB สามภาพ) หรือด้วยชื่อไฟล์เป็นอินพุต (คุณอาจสมมติว่ารูปภาพนั้นมีชื่อไฟล์เฉพาะอาจไม่มีส่วนขยาย) ส่งออกภาพแทนช่องสีเดียวของภาพ

คุณจะใช้อินพุตอื่นแทนช่องสัญญาณที่จะส่งออก อินพุตสามารถเป็นหนึ่งใน 3 สัญลักษณ์ที่แตกต่างกัน อย่างไรก็ตามสัญลักษณ์จะต้องเป็นสตริงหรือตัวเลข คุณไม่สามารถใช้ matrice เพื่อนำไปใช้กับอาร์เรย์เป็นอินพุตได้ (เช่น{1, 0, 0}หรือ{0, 1, 0})

คุณจะส่งสัญญาณออก<input>ช่องของภาพที่ป้อน คุณสามารถบันทึกลงในไฟล์หรือส่งออกชุดคู่ RGB

โปรแกรมของคุณไม่ควรมีข้อ จำกัด เกี่ยวกับขนาดของภาพ (เป็น px) และต้องรองรับ.png, .jpg/ .jpeg/ .JPGหรือ RGB แบบสามเท่าในรูปแบบภาพ (สามารถรองรับได้มากเท่าที่คุณต้องการ)

กรณีทดสอบ:

สีม่วงเดิม

ช่องสีแดง:

สีม่วงแดง

ช่องสีเขียว:

สีเขียวอมม่วง

ช่องสีฟ้า:

สีม่วงสีฟ้า

และอีกกรณีทดสอบสีแดงทั้งหมด ภาพต้นฉบับ , สีแดง , สีเขียวและสีฟ้า (คำเตือน: ช่องธรรมดาและสีแดงเจ็บที่ต้องดูนานเกินไป)

อีก 2 กรณีทดสอบ:

เดิม , สีแดง , สีเขียว , สีฟ้า

เดิม , สีแดง , สีเขียว , สีฟ้า

หลังสองกรณีทดสอบจากภาพที่มีทุกสี


นี่เป็นแรงบันดาลใจที่ดีสำหรับภาษากอล์ฟที่ transpiles / คอมไพล์กับการทำงานของ OpenCV
Reinstate Monica - ζ--

คำตอบ:


2

APL (Dyalog) 7 ไบต์

I / O: อาร์เรย์ของ RGB triplets

⎕×⊂⎕=⍳3

ลองออนไลน์!

⍳3 จำนวนเต็มสามตัวแรก

⎕= เปรียบเทียบอินพุตตัวเลข (ช่องที่เลือก) กับสิ่งนั้น

 ใส่ (เพื่อให้แต่ละ triplet จับคู่ triplet ทั้งหมดนี้)

⎕× ใส่ตัวเลขที่เป็นตัวเลข (อาร์เรย์ของ triplets) กับที่


12

JavaScript (ES6), 29 ไบต์

a=>n=>a.map(b=>b.map(c=>c&n))

อินพุตเป็นอาร์เรย์ 2 มิติของจำนวนเต็ม 24 บิต (เช่น[[0x0000ff,0x00ff00],[0xff0000,0xffffff]]) และ16711680สำหรับสีแดง65280สำหรับสีเขียว255สำหรับสีน้ำเงิน หากไม่ถูกต้องให้ลองทำสิ่งนี้แทน:

JavaScript (ES6), 48 ไบต์

a=>n=>a.map(b=>b.map(c=>c.map((d,i)=>i==n?d:0)))

อินพุตคืออาร์เรย์ 3 มิติของค่าสีและ0สำหรับสีแดง1สำหรับสีเขียว2สำหรับสีน้ำเงิน


1
รูปแบบการป้อนข้อมูลแบบหน้าด้าน ๆ ฮ่า ๆ
Conor O'Brien

10

Mathematica ขนาด 13 ไบต์

ImageMultiply

นี่ควรเป็นคำตอบของ JungHwan Min ที่ถูกต้องตามกฎหมาย ฟังก์ชั่นนี้จะนำภาพและหนึ่งRed, Green, Blueเป็น input ตัวอย่างเช่น:

ป้อนคำอธิบายรูปภาพที่นี่

ตามความเป็นจริงแล้วมันมีColorSeparateช่องให้คุณแยกต่างหาก แต่มันกลับมาเป็นภาพเดียว / ช่องสีเทาดังนั้นคุณจะต้องคูณด้วยสีในภายหลัง


มีสิ่งใดที่ Mathematica ไม่มีในตัวใช่หรือไม่
Brian Minton

8

Bash + ImageMagick, 35 32 27 ไบต์

mogrify -channel $1 -fx 0 i

ถือว่าภาพที่อยู่ในแฟ้มiและสคริปต์ที่จะใช้เวลาหนึ่งRG, BG, BRสีน้ำเงิน, สีแดง, สีเขียวและสีตามลำดับ iผลไปยังแฟ้ม


เอาชนะฉันไป ฉันโพสต์คำตอบ bash + IM อื่นด้านล่างพร้อมการเพิ่มประสิทธิภาพที่คุณสามารถขโมยได้
Sparr

@Sparr ฉันเล่นกอล์ฟที่แตกต่างกัน
betseg

คุณยังสามารถบันทึกสองไบต์ด้วย mogrify และไม่ 'o'
Sparr

7

สเปกตรัม , ไม่ใช่การแข่งขัน, 1 ไบต์

(ไม่ใช่การแข่งขันเนื่องจากความท้าทายนี้เป็นแรงบันดาลใจให้กับภาษานี้) ในความเป็นจริง Spectrum เป็นไลบรารี npm พร้อมอินเตอร์เฟสภาษาสำหรับคำสั่ง

I

ใช้อินพุตเป็น:

<filename>
channel

เรียกโปรแกรมเป็น:

cat input.txt | node spectrum.js "I"

หรือคุณอาจให้ข้อมูลกับคำแนะนำ:

λ node spectrum.js "I"
input> Ov3Gm.png
input> r
[ Image { 512x512 } ]

สิ่งนี้จะทำให้ภาพในกองซ้อน หากต้องการดูเพิ่มOในตอนท้ายเช่น:

λ node spectrum.js "IO"
input> Ov3Gm.png
input> r
[]

echo filename | node spectrum.js "wO"เพื่อความสนุกสนานพิเศษบางอย่างให้ลอง มันทำการแยกสัญญาณทั้งสามช่องพร้อมกัน:

Warhol


1
@ThisGuy ใช่มันสามารถทำการตรวจสอบขั้นแรกได้:n[d1=`[d1-P*][],.g!]#Pdd1-P~%-1=p
Conor O'Brien

1
@ ConorO'Brien คุณเห็นเครื่องทดสอบแบบดั้งเดิมของฉันสำหรับผู้ดำเนินการ fx ของ ImageMagick หรือไม่?
Sparr

@ ไม่ใช้ฉันไม่ได้ Link?
Conor O'Brien


7

JavaScript (ES6), 29 ไบต์

a=>b=>a.map((v,i)=>i%3^b?0:v)

เป็นจำนวนมากเช่นคำตอบ ETHproductions'แต่มีการป้อนข้อมูลความยืดหยุ่นมากขึ้นกว่าวิธีแรกและมีขนาดเล็กกว่าหนึ่งวินาที

ฟังก์ชั่นนี้กำหนดฟังก์ชั่นที่ยอมรับภาพเป็นอาเรย์ 1 มิติของความเข้มของสีตัวเลข ฟังก์ชั่นนี้จะส่งคืนฟังก์ชันอื่นที่ยอมรับค่าจำนวนเต็มแทนช่องสีที่ต้องการ

สีสามารถแสดงด้วยช่วงตัวเลขใด ๆ ตราบใดที่ 0 หมายถึงไม่มีสีสมบูรณ์ เช่น0.0 - 1.0หรือ0 - 255

ตัวอย่าง:

หากข้อมูลภาพอยู่ในรูปแบบ RGB การเรียกฟังก์ชั่นพร้อมอาร์กิวเมนต์(imageData)(0)จะคืนค่ารูปภาพด้วยช่องสีแดงเท่านั้น

หากข้อมูลภาพอยู่ในรูปแบบ BGR การเรียกใช้ฟังก์ชันที่มีอาร์กิวเมนต์(imageData)(2)จะส่งคืนรูปภาพด้วยช่องสีแดงเท่านั้น


ฉันเดาว่าi%3==b&&vยังใช้งานได้
Neil

6

Python 2, 69 ไบต์

from cv2 import*
def f(s,i):k=imread(s);k[:,:,[i,i-1]]=0;imwrite(s,k)

ยังคงเล่นกอล์ฟ

รับอินพุตเป็นfilename, n(โดยที่n0, 1 หรือ 2) บันทึกภาพใหม่เหนือภาพเก่า 0เป็นสีเขียว1เป็นสีแดงและ2เป็นสีน้ำเงิน ขอบคุณ @ovs, @Mikhail และ @Rod สำหรับการปิดไบต์


บันทึกไบต์โดยการปล่อย x และแทนที่k[:,:,x[i][0]]=k[:,:,x[i][1]]=0ด้วยk[:,:,[1,2,0][i]]=k[:,:,i]=0
ovs

@ovs ขอบคุณ! ... จริง ๆ แล้วฉันเพิ่งมากับข้อเสนอแนะที่สองตัวเองหลังจากยุ่งกับคุณ คุณนินจาทำให้ฉันรู้
Rɪᴋᴇʀ

คุณสามารถใช้from cv2 import*เพื่อบันทึกไม่กี่ไบต์
Rod

ดูเหมือนว่าคุณสามารถแทนที่k[:,:,i-1]=k[:,:,i]=0ด้วยk[:,:,[i,i-1]]=0
มิคาอิล V

5

CJam , 12 ไบต์

{3,f=f{f.*}}

บล็อกแบบไม่ระบุชื่อที่คาดว่าอาร์เรย์ 3D ของ RGB triplets และตัวเลขระหว่าง 0 ถึง 2 รวมอยู่ในสแต็ก ปล่อยให้อาร์เรย์ที่แยกออกมาบนสแต็กหลังจากนั้น

Red   -> 0
Green -> 1
Blue  -> 2

อาจจะเล่นกอล์ฟโดยใช้รูปแบบการป้อนข้อมูลที่แปลกประหลาด แต่ฉันรู้สึกว่ามันโกงนิดหน่อย

ลองออนไลน์!

กรณีทดสอบถูกสร้างขึ้นเพื่อแสดงให้เห็นว่าการใช้ภาพสามภาพจากภาพจริงนั้นใหญ่เกินไป

คำอธิบาย

3,          e# The range [0 1 2]
  f=        e# Check each for equality with the RGB indicator, gives the indicator array:
            e#  [1 0 0] for 0, [0 1 0] for 1, [0 0 1] for 2
    f{      e# Map on each row of the array using the indicator array as an extra parameter
      f.*   e#  Perform vectorized multiplication of the indicator array with each triplet.
            e#   For red, multiplies red by 1, and green and blue by 0. Does similarly
            e#   for green and blue.
         }  e# (end of block)

5

PowerShellขนาด 282 ไบต์

$x,$y=$args;1..($a=New-Object System.Drawing.Bitmap $x).Height|%{$h=--$_;1..$a.Width|%{$i=("$($a.GetPixel(--$_,$h)|select R,G,B)"|iex)[$y];$r,$g,$b=(((0,0,$i),(0,$i,0))[$y-eq'G'],($i,0,0))[$y-eq'R'];$a.SetPixel($_,$h,[system.drawing.color]::fromargb($r,$g,$b))}};$a.save("$x$y.png")

ไม่มี "แฟนซีการเล่นอินพุท" หรือ "การใช้บิวด์อิน" โทรศัพท์บนนั้น ;-)

นี่ใช้เส้นทางเต็มของอินพุต PNG (แม้ว่าพูดอย่างเคร่งครัดมันไม่จำเป็นต้องเป็น PNG เนื่องจาก JPG, BMP, ฯลฯ ได้รับการสนับสนุนโดย. NET แต่ฉันได้ลองใช้กับ PNG เท่านั้น) และเป็นหนึ่งใน(R, G, B)สำหรับช่องสีแล้วเก็บเหล่านั้นลงและ$x $yจากนั้นเราจะสร้างNew-ObjectประเภทSystem.Drawing.Bitmapของ$xและเก็บเข้าที่$aและเก็บเข้าที่

จากนั้นเราจะวนรอบสองเท่าของพิกเซลทั้งหมด ครั้งแรกจาก1ถึง$a's .Height, การตั้งค่า$hแต่ละซ้ำ (มันเป็นศูนย์การจัดทำดัชนีเพื่อที่ว่าทำไมเรา--$_ซึ่งจะช่วยประหยัดไบต์มากกว่า( .height-1). ภายในวงเราจาก1ถึง$a' .Widths

การวนซ้ำแต่ละครั้งเรากำลังดำเนินการ.GetPixelกับw,hพิกัดเฉพาะซึ่งส่งคืนSystem.Drawing.Colorวัตถุ เราselectออกR G Bค่าของมัน iexนี่เป็นเคล็ดลับที่จะเปลี่ยนระเบียบนี้ใน Hashtable (เช่นสิ่งที่ต้องการ@{R=34; G=177; B=76}) [$y]เพื่อให้เราสามารถที่ดัชนีลงโดยตรงกับช่องสีที่ต้องการ ค่านั้นจะถูกเก็บไว้ใน$iค่าที่ถูกเก็บไว้ใน

ต่อไปเราจะตั้งค่าที่สาม$r, $g, $bจะเป็นผลของบางผู้ประกอบการหลอก ternary$yตามมูลค่าของตัวอักษร ตัวอย่างเช่นถ้า$yเป็นR$r=$i, $g=0, $b=0แล้วผลที่นี่คือ

จากนั้นเราทำการ.SetPixelย้อนกลับไปยังw,hพิกัดที่เฉพาะเจาะจงนั้นสร้างใหม่System.Drawing.Colorโดยใช้สแตติกFromARGB(ซึ่งถือว่าอัลฟาเป็นทึบแสงทั้งหมด) เมื่อเราวนลูปเสร็จแล้วเราก็เพียงแค่.SavePNG ไปยังไฟล์ใหม่

หมายเหตุ: การดำเนินการนี้ใช้เวลานานเนื่องจากการวนซ้ำอย่างอิสระในทุกพิกเซลและทำการคำนวณจำนวนมากและเรียกใช้การวนซ้ำแต่ละครั้ง

แบบทดสอบ:
AdmBorkBork Red AdmBorkBork Green AdmBorkBork Blue


3

Bash + ImageMagick, 41 ไบต์

C="RGB"
mogrify -channel ${C//$1} -fx 0 x

อินพุตเป็นไฟล์ชื่อxพารามิเตอร์บรรทัดคำสั่งหนึ่งRหรือGหรือB

เอาต์พุตจะเขียนทับไฟล์อินพุต

แตกต่างจากคำตอบของ betseg ในการรับพารามิเตอร์ช่องทางตัวอักษรที่เป็นธรรมชาติมากขึ้น นอกจากนี้ยังเขียนทับแทนที่จะส่งไฟล์ใหม่ที่ beteg สามารถขโมยได้ :)


$1ต้องการเครื่องหมายคำพูดชื่อไฟล์สามารถมีช่องว่าง
betseg

@ Betseg ไม่ได้จริงๆฉันบอกว่าคุณสามารถสันนิษฐานได้ว่ามันมีชื่อไฟล์ที่เฉพาะเจาะจง หากเขาต้องการเขาสามารถเปลี่ยนเป็นอ่านจากชื่อไฟล์xเป็น 1 ไบต์
Rɪᴋᴇʀ

@Riker โอ้ฉันไม่ได้สังเกตว่านั่นช่วยฉันด้วย: D
betseg

3

ชิป 78 ไบต์

 ~Z~vS
f/F,^-.
e/E|,-Z.
d/D|>zz^.
a/AMx-x-].
b/BMx-]v-'
c/CM]v-'
 >--v'
G/gh/H

ลองออนไลน์!

ชิพเป็นภาษา 2D ที่ทำงานบนบิตของส่วนประกอบของแต่ละไบต์ในสตรีมไบต์

ภาพรวม

โซลูชันเฉพาะนี้คาดว่าไบต์แรกของอินพุตจะเป็นอักขระควบคุม - เพื่อกำหนดว่าช่องใดที่จะเก็บ - และต่อไปนี้คือไบต์ของข้อมูลภาพ ข้อมูลภาพจะต้องเป็น RGB สามจุดหนึ่งไบต์ต่อช่องสัญญาณ 24 บิตต่อพิกเซล:

|  1  |  2  |  3  |  4  |  5  |  6  |  7  | ... | 3n-2 |  3n  | 3n+1 |
|     |   First Pixel   |   Second Pixel  | ... |      nth Pixel     |
| Ctl | Red | Grn | Blu | Red | Grn | Blu | ... |  Red |  Grn |  Blu |

อักขระควบคุมถูกตีความว่าเป็นเขตข้อมูลบิตแม้ว่าบิตต่ำสุดเพียงสามรายการเท่านั้นที่มีความหมาย:

0x1  keep Red channel
0x2  keep Green channel
0x4  keep Blue channel

หมายความว่าเราสามารถใช้อักขระ ASCII เพื่อเลือกช่องที่เราต้องการ:

1หมายถึงสีแดง
2หมายถึงสีน้ำเงิน
4หมายถึงสีเขียว

หรือทำสิ่งที่นักเล่น:

5รักษาสีแดงและสีน้ำเงิน แต่ไม่เป็นสีเขียว
7รักษาทุกช่อง (ภาพไม่เปลี่ยนแปลง)
0ปล่อยทุกช่อง (ภาพเป็นสีดำ)

มันทำงานอย่างไร

วิธีแก้ปัญหานี้ค่อนข้างหงุดหงิดเนื่องจากการเล่นกอล์ฟ แต่ที่นี่จะไป:

  1. อ่านบิตต่ำสามไบต์แรกด้วย C , BและAและเก็บบิตผู้ที่อยู่ในที่สอดคล้องกันของพวกเขาMเซลล์เอมอรี นอกจากนี้Sเอาต์พุตตัวพิมพ์ใหญ่สำหรับรอบแรก
  2. วนซ้ำสามบิตเหล่านั้นซ้ำ ๆ หากบิตปัจจุบันเปิดอยู่ให้ปิด/สวิตช์เพื่อส่งสัญญาณออกไบต์ปัจจุบันหากปิดอยู่ให้เปิดสวิตช์เพื่อให้เราส่งสัญญาณออกเป็นศูนย์ไบต์
  3. ดำเนินการต่อจนกว่าอินพุตจะหมด

กำลังดูผลลัพธ์

แน่นอนคุณสามารถใช้ hexdump หรือสิ่งที่น่าเบื่อ แต่ปรากฎว่าเป็นรูปแบบภาพที่ถูกต้องจริง (เกือบ): binary Portable PixMapแบบพกพา pixmap

เพียงเสียบข้อมูลภาพจากด้านบน (ลบด้วยไบต์ควบคุมแน่นอน) ลงในไฟล์ด้านล่างปรับความกว้าง / ความสูงให้ถูกต้องและคุณสามารถดูภาพในมุมมองที่เหมาะสมเช่น IrfanView แต่ง่ายกว่า (เช่นเบราว์เซอร์ส่วนใหญ่ บิวด์อิน) ไม่สามารถจัดการได้

P6
{width as ASCII} {height as ASCII}
255
{binary image data here}

ตัวอย่างเช่น (ใช้ escapes สำหรับข้อมูลดิบ):

P6
3 1
255
\xff\x00\x00\x00\xff\x00\x00\x00\xff

3

MATL, 21 13 ไบต์

Yi3:iml&!*3YG

ควรระบุช่องสีโดยใช้การจับคู่ดังต่อไปนี้: 1:red,2:green ,3:blue

ล่ามออนไลน์ไม่สามารถใช้imreadในการอ่านภาพดังนั้นนี่เป็นรุ่นที่แก้ไขเล็กน้อยซึ่งฉันได้เข้ารหัสภาพสุ่มลงในแหล่งที่ที่นี่เป็นรุ่นที่แก้ไขเล็กน้อยที่ฉันได้ยากรหัสภาพสุ่มเป็นแหล่งที่มา

คำอธิบาย

        % Implicitly grab first input as a string (filename)
Yi      % Read the image in from a filename or URL
3:      % Push the string literal 'rgb' to the stack
i       % Grab the second input as a number
m       % Check for membership. So for example 2 will yield [false, true, false]
l&!     % Permute the dimensions to turn this 1 x 3 array into a 1 x 1 x 3 array
*       % Multiply this with the input RGB image. It will maintain the channel which
        % corresponds with the TRUE values and zero-out the channels that corresponded to
        % the FALSE values
3YG     % Display the image


2

Clojure, 421 332 ไบต์

-89 ไบต์โดยการฝังทุกอย่างไว้อย่างจริงจังเปลี่ยนจากวิธีการแบบเดิม ๆ ที่ไร้สาระของฉันในการลอกช่องและกำจัดการนำเข้าโดยไม่จำเป็นโดยไม่จำเป็น

(import '(java.awt.image BufferedImage)'(clojure.lang Keyword)'(javax.imageio ImageIO)'(java.io File)'(java.awt Color))(fn[p i](doseq[y(range(.getHeight p))x(range(.getWidth p))](.setRGB p x y(.getRGB(apply #(Color. % %2 %3)(#(let[c(Color. %)](assoc [0 0 0]i(([(.getRed c)(.getGreen c)(.getBlue c)]%)i)))(.getRGB p x y))))))(ImageIO/write p"jpg"(File."./o.jpg")))

ตีออกครึ่งชั่วโมงก่อนที่การเปลี่ยนแปลงของฉันจะเริ่มต้นโดยไม่รู้ว่าฉันกำลังทำอะไรอยู่ ฉันมีประสบการณ์น้อยด้วยBufferedImageดังนั้นอาจมีวิธีที่ดีกว่านี้ ฉันยังดูถูกColorในการแปลงไปมาระหว่างจำนวนเต็มและการแทนค่าสีแต่ละช่อง

นี่เป็นเรื่องตลกที่ยิ่งใหญ่เมื่อเปรียบเทียบกับคำตอบอื่น ๆ ด้วยเหตุผลสองประการ (นอกเหนือจากที่เห็นได้ชัดว่า Clojure ไม่ใช่ภาษากอล์ฟ):

  • แทนที่จะจัดการกับอาร์เรย์ไบต์สิ่งนี้จะเป็นการใส่รูปภาพเปลี่ยนและส่งออก

  • ฉันใช้ Java-interop ซึ่งในขณะที่มีประโยชน์สามารถ verbose ค่อนข้างบางครั้ง การนำเข้าเพียงอย่างเดียวมีขนาดใหญ่กว่าคำตอบมากมาย

ดูรหัสด้านล่างเพื่อดูรายละเอียด

(ns bits.restrict-channel
  (:import (java.awt.image BufferedImage)
           (clojure.lang Keyword)
           (javax.imageio ImageIO)
           (java.io File)
           (java.awt Color)))

(defn restrict-channel
  "Accepts a BufferedImage and a index between 0 and 2 (inclusive).
  Removes color from all channels EXCEPT the channel indicated by color-i.
  color-i of 0 = keep red
  color-i of 1 = keep green
  color-i of 2 = keep blue"
  [^BufferedImage image ^long color-i]
  (let [; Turn a number representing RGB into a triplet representing [R G B]
        channels #(let [c (Color. %)]
                    [(.getRed c) (.getGreen c) (.getBlue c)])

        ; Create a new triplet that only contains color in the color-i channel
        zero-channels #(assoc [0 0 0] color-i ((channels %) color-i))]

    ; Loop over each pixel
    (doseq [y (range (.getHeight image))
            x (range (.getWidth image))]

      ; Grab the current color...
      (let [cur-color (.getRGB image x y)]

        ; ... setting it to stripped color triplet returned by zero-channels
        (.setRGB image x y

                          ; This "apply" part is just applying the stripped triplet to the Color constructor
                         ;  This is needed to convert the separate channels into the integer representation that `BufferedImage` uses. 

                 (.getRGB (apply #(Color. % %2 %3) (zero-channels cur-color))))))

    ; Save the result to file
    (ImageIO/write image "jpg" (File. "./o.jpg"))))

นี่เป็นสิ่งที่น่ายินดีหรือน่ากลัวที่สุดเท่าที่ฉันเคยเห็นมา ฉันจะไปกับอดีต
Rɪᴋᴇʀ

@Riker แน่นอนอดีต ฉันเริ่มเขียนครึ่งชั่วโมงก่อนที่การเปลี่ยนแปลงของฉันจะเริ่มต้นโดยไม่รู้ว่าฉันจะทำอย่างไร แต่มันใช้งานได้!
Carcigenicate

* ฉันหมายถึงอันหลังจริง ๆ แต่ความยุ่งเหยิงก็เป็นสิ่งที่ดีเช่นกัน
Carcigenicate

1

Lua (กรอบความรัก 2 มิติ), 498 ไบต์

ฉันทำแบบฝึกหัดนี้มากขึ้นสำหรับตัวเองดังนั้นจึงไม่สั้นเท่าที่ควร (แม้ว่าฉันพยายามเล่นกอล์ฟ) แต่ฉันต้องการเพิ่มที่นี่เพราะฉันคิดว่าฉันทำได้ดี แม้ว่าฉันจะสายเกินไป

ที่นี่รหัส golfed ภายใต้มันเป็นรุ่นที่อธิบายและไม่ได้แยก

l=love g,p,rm,bm,gm,s=l.graphics,0,1,1,1,[[uniform float m[4];vec4 effect(vec4 co,Image t,vec2 c,vec2 s){vec4 p=Texel(t,c);p.r=p.r*m[0];p.b=p.b*m[1];p.g=p.g*m[2];return p;}]]t=g.setShader h=g.newShader(s)function l.draw()h:send("m",rm,gm,bm)if p~=0 then t(h)g.draw(p)t()end end function l.filedropped(f)a=f:getFilename()p=g.newImage(f)end function l.keypressed(k)if k=="0"then rm,gm,bm=1,1,1 end if k=="1"then rm,gm,bm=1,0,0 end if k=="2"then rm,gm,bm=0,1,0 end if k=="3"then rm,gm,bm=0,0,1 end end

นี่คือรหัสที่จะต้องได้รับไฟล์ * .jpg หลังจากแทรกภาพแล้วคุณสามารถกดปุ่มตัวเลขสำหรับช่องสีแดง (1) สีเขียว (2) หรือสีน้ำเงิน (3) นอกจากนี้เมื่อต้องการดูรูปภาพเริ่มต้นอีกครั้งกด 0 จริง ๆ แล้วมันเพิ่งแสดงรูปภาพในหน้าต่าง

l=love
g=l.graphics
p=0
rm,bm,gm=1,1,1
s = [[uniform float m[4];
vec4 effect(vec4 co,Image t,vec2 c,vec2 s){vec4 p=Texel(t,c);p.r = p.r * m[0];p.b = p.b * m[1]; p.g = p.g * m[2]; return p;}
]]
sh=g.newShader(s)

function l.draw()
  sh:send("m",rm,gm,bm)
  if p~=0 then
    g.setShader(sh)
    g.draw(p)
    g.setShader()
  end
end

function l.filedropped(f)
  a=f:getFilename()
  p=g.newImage(f)
end

function l.keypressed(k)
  if k=="0"then rm,gm,bm=1,1,1 end
  if k=="1"then rm,gm,bm=1,0,0 end
  if k=="2"then rm,gm,bm=0,1,0 end
  if k=="3"then rm,gm,bm=0,0,1 end
end

ส่วนสำคัญที่ทำงานได้ทั้งหมดคือ shader ซึ่งเป็นการประกาศสตริงขนาดเล็กที่จุดเริ่มต้นหรือไม่มีการโยง:

uniform float m[4];
vec4 effect(vec4 co,Image t,vec2 c,vec2 s)
{
    vec4 p=Texel(t,c);
    p.r = p.r * m[0];
    p.b = p.b * m[1];
    p.g = p.g * m[2]; 
    return p;
}

ซึ่งได้รับพิกเซลที่แท้จริงของภาพและเพียงแค่แสดงช่องตามที่ต้องการ

ภาพทดสอบของฉันและเอาท์พุทที่แตกต่างกันสำหรับช่องสัญญาณ (อีกอย่างแน่นอนเช่นกัน) ภาพเริ่มต้นและภาพช่องรวมเข้าด้วยกัน


ขอขอบคุณสำหรับคำแนะนำของคุณผมคงมันครั้งต่อไปฉันรู้ :)
Lycea

ไม่มีปัญหา! ยินดีต้อนรับสู่ ppcg หวังว่าคุณจะติดอยู่!
Rɪᴋᴇʀ

นอกจากนี้คุณยังสามารถเล่นกอล์ฟนี้ คุณไม่จำเป็นต้องใส่ปุ่มและเช่น
Rɪᴋᴇʀ

0

C, 60 58 ไบต์

main(a,b)char**b;{while(scanf(b[1],&a)>0)printf("%d ",a);}

ใส่รูปภาพคือรายการตัวเลข (เป็นทศนิยม) ระหว่าง 0 ถึง 255 on stdinเช่น

255 0 0  192 192 192  31 41 59 ...

ช่องทางที่ระบุไว้เป็นอาร์กิวเมนต์แรกของโปรแกรมและเป็นหนึ่งใน

red   -> "%d%*d%*d"
green -> "%*d%d%*d"
blue  -> "%*d%*d%d"

ตัวอย่าง:

$ echo "255 0 0" | ./extract "%d%*d%*d"
255 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.