কোনও চিত্রের আরজিবি চ্যানেলটি বের করুন


22

কোনও চিত্র দেওয়া হয়েছে, হয় ইনপুট হিসাবে (সম্ভবত আরজিবি ট্রিপল্টে) অথবা ফাইলের নাম হিসাবে ইনপুট হিসাবে (আপনি ধরে নিতে পারেন চিত্রটির একটি নির্দিষ্ট ফাইলের নাম রয়েছে, সম্ভবত কোনও এক্সটেনশন ছাড়াই), চিত্রের একক রঙের চ্যানেল উপস্থাপন করে একটি চিত্র আউটপুট দেয়।

কোন চ্যানেলটিকে আউটপুট দিতে হবে তা উপস্থাপন করে আপনি আরও একটি ইনপুট নেবেন। ইনপুটটি কোনও 3 স্বতন্ত্র চিহ্নগুলির মধ্যে একটি হতে পারে। তবে, চিহ্নগুলি অবশ্যই একটি স্ট্রিং বা একটি সংখ্যা হতে হবে। ইনপুট হিসাবে অ্যারেতে আবেদন করার জন্য আপনি ম্যাট্রিস নিতে পারবেন না। (যেমন {1, 0, 0}, বা {0, 1, 0})

আপনি <input>ইনপুট ইমেজ চ্যানেল আউটপুট হবে । আপনি এটি কোনও ফাইলে সংরক্ষণ করতে পারেন বা আরজিবি জোড়াগুলির একটি সেট আউটপুট করতে পারেন।

আপনার প্রোগ্রামটির চিত্রের আকারের কোনও সীমা থাকবে না (px এ) এবং অবশ্যই .png, .jpg/ .jpeg/ .JPG, অথবা আরজিবি ট্রিপল্টগুলি চিত্র ফর্ম্যাট হিসাবে সমর্থন করবে । (এটি তবে আপনি যতটুকু সমর্থন করতে পারেন)

পরীক্ষা ক্ষেত্রে:

বেগুনি মূল

লাল চ্যানেল:

বেগুনি লাল

সবুজ চ্যানেল:

বেগুনি সবুজ

নীল চ্যানেল:

বেগুনি নীল

এবং অন্য একটি টেস্ট কেস, পুরোপুরি লাল। মূল ফটো , লাল , সবুজ এবং নীল । (সতর্কতা: প্লেইন এবং লাল চ্যানেলটি খুব দীর্ঘ সময় দেখার জন্য আঘাত করেছে)

আরও 2 টি পরীক্ষার মামলা:

আসল , লাল , সবুজ , নীল

আসল , লাল , সবুজ , নীল

দ্বিতীয় দুটি পরীক্ষার ক্ষেত্রে সমস্ত রঙের চিত্র রয়েছে


এটি একটি গল্ফিং ভাষার জন্য ভাল অনুপ্রেরণা যা ওপেনসিভি ক্রিয়াকলাপগুলিকে স্থানান্তর / সংকলন করে।
মনিকা পুনরায় ইনস্টল করুন - :5--

উত্তর:


2

এপিএল (ডায়ালগ) , 7 বাইট

আই / ও: আরজিবি ট্রিপল্টের অ্যারে

⎕×⊂⎕=⍳3

এটি অনলাইন চেষ্টা করুন!

⍳3 প্রথম তিনটি পূর্ণসংখ্যা

⎕= সংখ্যার ইনপুট (নির্বাচিত চ্যানেল) এর সাথে তুলনা করুন

 ঘেরযুক্ত (সুতরাং প্রতিটি চিত্র ট্রিপলেট এই পুরো ট্রিপলেট জুড়ে)

⎕× এর সাথে সংখ্যাযুক্ত ইনপুট (ট্রিপল্টের অ্যারে) গুন করুন


12

জাভাস্ক্রিপ্ট (ES6), 29 বাইট

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

ইনপুট হল 24-বিট পূর্ণসংখ্যার (যেমন [[0x0000ff,0x00ff00],[0xff0000,0xffffff]]) এবং 16711680লাল, 65280সবুজ, 255নীল রঙের 2D অ্যারে for এটি বৈধ না হলে পরিবর্তে এটি ব্যবহার করে দেখুন:

জাভাস্ক্রিপ্ট (ES6), 48 বাইট

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

ইনপুট হল রঙের মানগুলির একটি 3 ডি অ্যারে এবং 0লাল, 1সবুজ, 2নীল রঙের জন্য।


1
চেচি ইনপুট ফর্ম্যাট হাহা
কনর ও'ব্রায়ান

10

গণিত, 13 বাইট

ImageMultiply

এটি জাংহওয়ান মিনের উত্তরের বৈধ সংস্করণ হওয়া উচিত। এই ফাংশনটি ইমেজ এবং এক সময় লাগে Red, Green, Blueইনপুট হিসাবে। উদাহরণ স্বরূপ:

এখানে চিত্র বর্ণনা লিখুন

একটি মজাদার-সত্য হিসাবে, ColorSeparateযা আপনাকে পৃথক চ্যানেলগুলি দেয়, কিন্তু এটি তাদের একক চ্যানেল / গ্রেস্কেল চিত্র হিসাবে ফিরিয়ে দেয়, সুতরাং আপনাকে পরে রঙের মাধ্যমে এগুলি বাড়িয়ে দেওয়া দরকার।


ম্যাথামেটিকায় কি অন্তর্নির্মিত কিছু নেই?
ব্রায়ান মিন্টন

8

বাশ + চিত্রম্যাগিক, 35 32 27 বাইট tes

mogrify -channel $1 -fx 0 i

অনুমান ইমেজ ফাইল রয়েছে iএবং স্ক্রিপ্ট এক সময় লাগে RG, BG, BRনীল, লাল, সবুজ যথাক্রমে জন্য; ফাইল আউটপুট i


আমাকে এটি মারধর। আমি নীচে একটি আলাদা বাশ + আইএম উত্তর পোস্ট করেছি, আপনি চুরি করতে পারেন এমন একটি অপ্টিমাইজেশন সহ
স্পার

@ স্পার আমি একটি আলাদা গল্ফিং করেছি
betseg

আপনি এখনও মোগ্রিফাই এবং 'ও' দিয়ে দুটি বাইট সংরক্ষণ করতে পারেন?
স্পার

7

স্পেকট্রাম , নন-কেপটিং, 1 বাইট

(অ-প্রতিযোগী কারণ এই চ্যালেঞ্জটি এই ভাষাটিকে অনুপ্রাণিত করেছে)) বাস্তবে, স্পেকট্রাম হ'ল আদেশগুলির জন্য একটি ভাষা ইন্টারফেস সহ একটি এনপিএম গ্রন্থাগার।

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
@ এই গিগু হ্যাঁ, এটি প্রাথমিকতা পরীক্ষা করতে পারে:n[d1=`[d1-P*][],.g!]#Pdd1-P~%-1=p
কনর ও'ব্রায়ান

1
@ কনরও'ব্রায়েন কি আপনি ইমেজম্যাগিকের fx অপারেটরের জন্য আমার প্রাথমিকতা পরীক্ষকটি দেখেছেন?
স্পার

@ স্পার নং, আমি পাইনি। লিঙ্ক করবেন?
কনর ও'ব্রায়ান


7

জাভাস্ক্রিপ্ট (ES6), 29 বাইট

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

অনেকগুলি ইটিএইচ প্রডাকশনগুলির উত্তরের মতো তবে প্রথম পদ্ধতির চেয়ে আরও নমনীয় ইনপুট এবং দ্বিতীয়টির চেয়ে ছোট।

এটি এমন একটি ফাংশন সংজ্ঞায়িত করে যা চিত্রকে সংখ্যার রঙের তীব্রতার 1-মাত্রিক অ্যারে হিসাবে গ্রহণ করে। এর পরে এই ফাংশনটি আবার একটি ফাংশন দেয় যা পছন্দসই রঙ চ্যানেল উপস্থাপন করে একটি পূর্ণসংখ্যা মান গ্রহণ করে।

রঙগুলি যে কোনও সংখ্যাসূচক দ্বারা প্রতিনিধিত্ব করা যায় যতক্ষণ 0 0 সম্পূর্ণ রঙের অনুপস্থিতি নির্দেশ করে। যেমন 0.0 - 1.0বা0 - 255

উদাহরণ:

যদি চিত্রের ডেটা আরজিবি বিন্যাসে থাকে তবে আর্গুমেন্ট সহ ফাংশনটি কল করে (imageData)(0) করা কেবলমাত্র লাল চ্যানেল দিয়ে চিত্রটি ফিরিয়ে দেবে।

যদি চিত্রের ডেটা বিজিআর ফর্ম্যাটে থাকে তবে আর্গুমেন্ট সহ ফাংশনটি কল করা (imageData)(2)কেবলমাত্র লাল চ্যানেল দিয়ে চিত্রটি ফিরিয়ে দেবে।


আমার i%3==b&&vধারণাও কাজ করে।
নীল

6

পাইথন 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, @ মিখাইল এবং @ রডকে ধন্যবাদ বাইট অফ করার জন্য।


এক্স ড্রপ এবং প্রতিস্থাপন করে কিছু বাইট সংরক্ষণ k[:,:,x[i][0]]=k[:,:,x[i][1]]=0সঙ্গেk[:,:,[1,2,0][i]]=k[:,:,i]=0
ovs

@ ওভস থ্যাঙ্কস! ... আপনার সাথে গণ্ডগোল করার পরে আমি নিজেই দ্বিতীয় পরামর্শটি নিয়ে এসেছি। আপনি যদিও আমাকে এতে নিনজা করেছেন।
আর

আপনি from cv2 import*কয়েকটি বাইট সংরক্ষণ করতে ব্যবহার করতে পারেন
রড

মনে হচ্ছে আপনি প্রতিস্থাপন করতে পারেন k[:,:,i-1]=k[:,:,i]=0সঙ্গেk[:,:,[i,i-1]]=0
মিখাইল ভি

5

সিজেম , 12 বাইট

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

একটি অজ্ঞাতনামা ব্লক যা আরজিবি ট্রিপল্টের 3 ডি অ্যারে এবং স্ট্যাকের সাথে 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

পাওয়ারশেল , 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")

এই অভিনব কোনওটিই "ইনপুট গল্ফিং" বা "বিল্ট-ইনগুলি ব্যবহার করে"। তার উপর ফুয়ে ;-)

এটি এখানে একটি ইনপুট পিএনজির পুরো পথটি নিয়েছে (যদিও, কঠোরভাবে বলতে গেলে, এটি পিএনজি হওয়ার দরকার নেই , যেহেতু জেপিজি, বিএমপি, ইত্যাদি। নেট দ্বারা সমর্থিত, তবে আমি কেবল এটি পিএনজিতে চেষ্টা করেছি), এবং একটি(R, G, B) রঙ চ্যানেলের জন্য, তারপরে সেগুলিকে $xএবং এর মধ্যে সঞ্চয় করে $y। আমরা তখন একটি তৈরি New-Objectধরনের System.Drawing.Bitmapএর $xএবং যে মধ্যে সংরক্ষণ$a

তারপরে আমরা সমস্ত পিক্সেলের উপরে ডাবল লুপ করি। প্রথম থেকে 1পর্যন্ত $aএর.Height , সেটিং $hপ্রতিটি পুনরাবৃত্তির (এটা জিরো-ইন্ডেক্স, তাই এটা কেন আমরা এর --$_, যা সংরক্ষণ করে ধরে বাইট ( .height-1)। ইনসাইড, আমরা থেকে লুপ 1পর্যন্ত $aএর .Width

প্রতিটি পুনরাবৃত্তি, আমরা .GetPixelনির্দিষ্ট w,hস্থানাঙ্কগুলিতে একটি সম্পাদন করছি , যা a প্রদান করেSystem.Drawing.Color বস্তু । আমরা selectএর R G Bমান খুঁজে বের করি । iexএখানে একটি ঝরঝরে কৌতুক করে একটি hashtable এই সক্রিয় (যেমন, ভালো কিছু @{R=34; G=177; B=76}) যাতে আমরা পারি পছন্দসই রঙ চ্যানেলের সাথে সরাসরি যে মধ্যে সূচক [$y]। সেই মানটি সঞ্চিত $i

এর পরে, আমরা কয়েকটিটির $r, $g, $bফলাফল হতে তিনটি মান সেট করি অক্ষরের মানের উপর ভিত্তি করে সিউডো-টের্নারি অপারেটরগুলির$y । সুতরাং, উদাহরণস্বরূপ, যদি $yহয় R, তবে এখানে ফলাফল $r=$i, $g=0, $b=0

তারপরে, আমরা একটি করি .SetPixel সেই নির্দিষ্ট w,hস্থানাঙ্কের পিছনে পিছনে System.Drawing.Colorস্থির হয়ে স্ট্যাটিক FromARGB(যা আলফাটিকে পুরোপুরি অস্বচ্ছ বলে ধরে নেয়) ব্যবহার করে একটি নতুন নির্মাণ করি । লুপিং শেষ হয়ে গেলে আমরা কেবল সহজভাবে.Save নতুন ফাইলটিতে পিএনজি করব।

দ্রষ্টব্য: এটি বেশিক্ষণ সময় নেয়, যেহেতু এটি প্রতিটি পিক্সেল থেকে সম্পূর্ণ স্বতন্ত্রভাবে লুপিং করে এবং গণনার একগুচ্ছ সম্পাদন করে এবং প্রতিটি পুনরাবৃত্তি কল করে।

পরীক্ষা:
অ্যাডমবর্কবর্ক রেড অ্যাডমবর্কবর্ক সবুজ অ্যাডমবর্কবর্ক ব্লু


3

বাশ + চিত্রম্যাগিক, 41 বাইট

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

ইনপুট নামে একটি ফাইল x, এক প্যারামিটার কমান্ড লাইন RবাG বাB

আউটপুট ইনপুট ফাইলকে ওভাররাইট করে

আরও প্রাকৃতিক একক-অক্ষর চ্যানেল প্যারামিটার গ্রহণের ক্ষেত্রে বেটসেকের উত্তর থেকে পৃথক। এছাড়াও নতুন ফাইল আউটপুট না করে ওভাররাইটিং করা যা betseg চুরি করতে বিনামূল্যে :)


$1উদ্ধৃতি চিহ্নের প্রয়োজন, ফাইলের নাম স্পেস থাকতে পারে
betseg

@ বিটসেগ আসলেই নয়, আমি বলেছি আপনি ধরে নিতে পারেন এটির একটি নির্দিষ্ট ফাইল নাম রয়েছে। তিনি চাইলে, এমনকি এটি কোনও ফাইলের নাম xথেকে 1 বাইট অফের জন্য পড়তে এটি পরিবর্তন করতে পারেন ।
আর

@ রিকার ওহ, আমি লক্ষ্য করিনি যে, এটি আমাকেও সাহায্য করে: ডি
বেটসেগ

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

এটি অনলাইন চেষ্টা করুন!

চিপ একটি 2 ডি ভাষা যা বাইট স্ট্রিমের প্রতিটি বাইটের উপাদান বিটগুলিতে পরিচালনা করে।

সংক্ষিপ্ত বিবরণ

এই নির্দিষ্ট সমাধানটি ইনপুটটির প্রথম বাইট নিয়ন্ত্রণ অক্ষর হিসাবে প্রত্যাশা করে - কোন চ্যানেল (গুলি) রাখতে হবে তা নির্ধারণ করতে - এবং নিম্নলিখিতটি চিত্রের ডেটা বাইট। চিত্রের ডেটা অবশ্যই আরজিবি ট্রিপল্ট, প্রতি চ্যানেল প্রতি বাইট, পিক্সেল 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, এবং তাদের সংশ্লিষ্ট ঐ বিট সংরক্ষণ MEmory কোষ। এছাড়াও, Sপ্রথম চক্রের জন্য বড় হাতের আউটপুট।
  2. বারবার তিনটি বিট উপর লুপ। যদি বর্তমান বিট এটি চালু থাকে তবে এটি বন্ধ করুন/ তবে বর্তমান ইনপুট বাইট আউটপুট সুইচগুলি করুন, যদি এটি বন্ধ থাকে তবে স্যুইচগুলি খুলুন যাতে আমরা একটি শূন্য বাইট আউটপুট করি।
  3. ইনপুট শেষ না হওয়া পর্যন্ত চালিয়ে যান।

ফলাফল দেখুন

অবশ্যই, আপনি হেক্সডাম্প বা বিরক্তিকর কিছু ব্যবহার করতে পারেন, তবে এটি (প্রায়) একটি বাস্তব বৈধ চিত্র ফর্ম্যাট: বাইনারি পোর্টেবল পিক্স্যাপ

উপরের চিত্রটি কেবল উপরের ফাইলটিতে (মাইনাস কন্ট্রোল বাইট, অবশ্যই) নীচের ফাইলটিতে প্লপ করুন, প্রস্থ / উচ্চতা বৈধ হওয়ার জন্য সামঞ্জস্য করুন এবং আপনি ইরফানভিউয়ের মতো উপযুক্ত দর্শনে চিত্রটি দেখতে পারেন, যদিও সরল রয়েছে (বেশিরভাগ ব্রাউজারের মতো) বিল্ট-ইনগুলি) এটি পরিচালনা করতে পারে না।

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

উদাহরণস্বরূপ (কাঁচা ডেটার জন্য পলায়ন ব্যবহার করে):

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

3

এমএটিএল, 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

ক্লোজার, 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পূর্ণসংখ্যার এবং রঙের পৃথক চ্যানেলের উপস্থাপনার মধ্যে রূপান্তর করতে গালিও দিচ্ছি ।

এটি বেশ কয়েকটি কারণে অন্যান্য উত্তরের তুলনায় কমোগুলিভাবে বিশাল (এটি ছাড়াও ক্লোজুর একটি গল্ফের ভাষা নয়):

  • কেবলমাত্র একটি বাইট অ্যারে হেরফের করার পরিবর্তে এটি আসলে কোনও চিত্র ইনপুট হিসাবে নেয়, এটিকে পরিবর্তন করে এবং আউটপুট দেয়।

  • আমি জাভা-ইন্টারপ ব্যবহার করছি, যা সময়ে সময়ে বেশ কার্যকর হতে পারে। আমদানি একা অনেক উত্তরের চেয়ে বড়।

একটি ডাউন ডাউন জন্য নীচের কোড দেখুন।

(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"))))

এটি হয় আমার মধ্যে সবচেয়ে গৌরবময় বা ভৌতিক জিনিস rific আমি প্রাক্তনের সাথে যাচ্ছি।
আর

@ রিকার অবশ্যই পূর্বের। আমি কীভাবে এটি করতে যাচ্ছি তা নিয়ে আমার শিফট শুরু হওয়ার আধ ঘন্টা আগে আমি এটি লেখা শুরু করেছি। কিন্তু এটি কাজ করে!
কারসিজেনিকেট

* আমি আসলে বোঝাতে চেয়েছি তবে গৌরবময় মেসগুলিও একটি জিনিস।
কারডিজিনিকেট

1

লুয়া (love2d ফ্রেমওয়ার্ক), 498 বাইট

আমি নিজের জন্য অনুশীলন হিসাবে এটি আরও বেশি করেছি, সুতরাং এটি যতটা সম্ভব সংক্ষিপ্ত নয় (যদিও আমি গল্ফ দেওয়ার চেষ্টা করেছি) তবে আমি এটিকে এখানে যুক্ত করতে চেয়েছিলাম কারণ আমি মনে করি যে আমি ভাল করেছি। এমনকি আমার অনেক দেরি হলেও।

এখানে গল্ফ কোড, এর নীচে বর্ণিত এবং অপরিবর্তিত সংস্করণ।

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 ফাইলটিতে ফেলে দেওয়া উচিত। চিত্রটি wasোকানোর পরে আপনি লাল (1) সবুজ (2) বা নীল (3) চ্যানেলের জন্য নম্বর বোতাম টিপতে পারেন। এছাড়াও ডিফল্ট ছবিটি আবার দেখতে 0 টিপুন ually আসলে এটি উইন্ডোতে কেবল চিত্রটি দেখায়।

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

যে সমস্ত গুরুত্বপূর্ণ কাজটি সমস্ত কাজ করে তা হ'ল শেডার যা শুরুতে ছোট স্ট্রিং ডিক্লারেশন বা শিরোনামহীন:

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

যা চিত্রটির প্রকৃত পিক্সেল পায় এবং প্রয়োজন হিসাবে কেবল চ্যানেলগুলি দেখায়।

আমার পরীক্ষার চিত্র এবং চ্যানেলগুলির জন্য পৃথক আউটপুট (অবশ্যই অন্যান্যগুলির জন্যও) ডিফল্ট চিত্র এবং চ্যানেল চিত্রগুলি মার্জ হয়েছে


আপনার ইঙ্গিতটির জন্য আপনাকে ধন্যবাদ, আমি এটি ঠিক করেছি, পরের বার আমি জানি :)
লিসিয়া

সমস্যা নেই! পিপিসিগিতে স্বাগতম, আশা করি আপনি আটকে থাকবেন!
আর

এছাড়াও, আপনি এখনও এটি গল্ফ করতে পারেন। আপনার বোতামগুলি এবং এগুলি অন্তর্ভুক্ত করার দরকার নেই।
আর

0

সি, 60 58 বাইট

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

চিত্র ইনপুট হল 0 এবং 255 এর মধ্যে সংখ্যার তালিকা (দশমিক ক্ষেত্রে) 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.