এইচএসএল থেকে আরজিবি মান


17

আরজিবি (রেড গ্রিন ব্লু) রঙের মডেলের মূল উদ্দেশ্যটি টেলিভিশন এবং কম্পিউটারগুলির মতো ইলেকট্রনিক সিস্টেমে চিত্রগুলি সেন্সিং, উপস্থাপন এবং প্রদর্শনের জন্য

এইচএসএল (হিউ স্যাচুরেশন লাইটনেস) হ'ল একটি বিকল্প রঙের মডেল, যা 1970 এর দশকে কম্পিউটার গ্রাফিক্স গবেষকদের দ্বারা ডিজাইন করা হয়েছিল যেভাবে মানুষের দৃষ্টি রঙ তৈরির বৈশিষ্ট্যগুলি আরও দৃce়রূপে দেখায়

আরজিবি এবং এইচএসএল- এর উইকি নিবন্ধগুলি এখানে রয়েছে । গ্রাফিক্স প্রোগ্রামগুলির পক্ষে এইচএসএলতে গণনা করা সাধারণ, এবং পরে বেশিরভাগ স্ক্রিনের জন্য পছন্দের বিন্যাসে রূপান্তর করা: আরজিবি।

কাজটি হ'ল একটি ফাংশন / প্রোগ্রাম লিখুন যা এইচএসএলকে একটি ইনপুট হিসাবে নেয় এবং আরজিবি আউটপুট করে।

আপনি I / O এর জন্য আপনার পছন্দসই প্রতিনিধিত্ব চয়ন করতে পারেন, যতক্ষণ না তাদের মধ্যে এটির সাথে সামঞ্জস্য থাকে।

উদাহরণস্বরূপ, তারা 3 উপাদানের সঙ্গে একটি অ্যারের / tuple বা 3 নামে properties সহযোগে একটি বস্তু হতে পারে h, sএবং l, কিন্তু আমি একটি পূর্ণসংখ্যা (হারানোর স্পষ্টতা) হিসেবে hsl গ্রহণ এবং একটি আরজিবি পূর্ণসংখ্যা outputting মত অন্যান্য চালাক বৈচিত্র গ্রহণ করব।

ইনপুটটি পরিসীমা এবং ফর্ম্যাটে নিরাপদ বলে ধরে নেওয়া যেতে পারে, উভয়ই আপনি সিদ্ধান্ত নিতে পারেন। আমি দৃ strongly়ভাবে ব্যাপ্তি 0-1 0-1 0-1বা 0-360 0-100 0-100hsl, এবং 0-1 0-1 0-1অথবা 0-255 0-255 0-255rgb এর জন্য পরামর্শ দিই ।

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

সিউডো পরীক্ষার ক্ষেত্রে 0-360 0-100 0-1000-255 0-255 0-255

h   s   l   → r   g   b

0   0   0   → 0   0   0
90  56  17  → 43  68  19
202 19  39  → 81  104 118
72  55  26  → 88  103 30

রূপান্তরকরণের সূত্রগুলি এখানে পাওয়া যাবে :

রূপান্তরটি কল্পনা করার এক দুর্দান্ত উপায় হিসাবে এটি:


জন্য আপনার প্রস্তাবিত পরিসীমা Hএর 0-360হয় [0,360), এটা ভাল হিসেবে লেখা যেতে হবে 0-359?
জোনাথন অ্যালান

3
@ জোনাথান অ্যালান আমার মনে হয় এটিকে কিছুটা বিভ্রান্তিকর মনে হতে পারে, যেমন আমার কাছে মনে হয় যে 395.1 কোনও সম্ভাব্য ইনপুট নয়। যদি কিছু a-bহয় তবে অ-পূর্ণসংখ্যার মানগুলির সাথে আচরণ করার সময় স্বরলিপিটি ব্যবহার করা নিজের মধ্যে ভুল is তবে আমি বলব যে প্রশ্নটি আরও পাঠযোগ্য ok অন্য কারও যদি অভিযোগ হয় তবে আমি এ নিয়ে পুনর্বিবেচনা করব, সুতরাং এটি উল্লেখ করার জন্য ধন্যবাদ
21: 21 এ টোচ

হ্যাঁ, 359.1 পয়েন্টে একমত - সম্ভবত [0,360)তখনকার স্ট্যান্ডার্ড স্বরলিপিটি ব্যবহার করুন :)
জনাথন অ্যালান

কোনও glsl উত্তর না দেখে অবাক;)
টাচ

উত্তর:


8

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

লাগে এইচ মধ্যে [0,360) এবং এস / এল[0,1)[0,1) এ 3 টি ভাসমান অ্যারের হিসাবে আউটপুট আর , জি এবং বি

(H,S,L)=>[5,3,1].map(i=>A(L*2)*S*([1,Y,0,0,Y,1][(i-~H)%6]-.5)+L,Y=(A=n=>n>1?2-n:n)((H/=60)%2))

পরীক্ষার মামলা

এই স্নিপেট ফলাফলগুলি [0,255] এ আবার রূপান্তর করে ।

কিভাবে?

প্রারম্ভিকেশন কোড

Y = (                  // we compute Y = 1 - |(H/60) mod 2 - 1| = X / C
  A = n =>             // A = function that returns 1 - |n - 1|
    n > 1 ?            //   first compare n with 1
      2 - n            //     which allows to simplify the formula to either 2 - n
    :                  //   or
      n                //     just n
)((H /= 60) % 2)       // divide H by 60 and compute Y = A(H % 2)

প্রধান কোড

[5, 3, 1].map(i =>     // for each i in (5, 3, 1):
  A(L * 2) * S * (     //   compute (1 - |2L - 1|) * S (this is C), and multiply it by:
    [1, Y, 0, 0, Y, 1] //     either 0, 1 or Y (let's call this factor K), picked from
    [(i - ~H) % 6]     //     a cyclic sequence of period 6, using i and ~H (-6 ≤ ~H ≤ -1)
    - .5               //     minus 1/2
  )                    //   this gives: C(K - 1/2) = CK - C/2, where CK = 0, C or X
  + L                  //   we add L, leading to CK - C/2 + L = CK + m
)                      // end of map() --> returns [R, G, B]

(0, সি, এক্স) এর অনুক্রম

সামান্য জটিল অংশ হিউ উপাদানটির কোণ অনুসারে (0, C, X) এর সঠিক অনুমান তৈরি করা । নিম্নলিখিত ছবিতে দেখানো, প্রতিটি কলাম মান সময়ের একই সাইক্লিং ক্রম থেকে বাছাই করা হয় 6 , বিভিন্ন অফসেট থেকে শুরু। উপরের কোডে, আমরা কেবলমাত্র + এইচ এর পরিবর্তে - ~ এইচ ব্যবহার করছি কারণ আমাদের পূর্ণসংখ্যার জন্য এইচকে জোর করা দরকার । সুতরাং অফসেটগুলি (0,4,2) এর পরিবর্তে (5,3,1)

                       C,X,0,0,X,C,C,X,0,0,X,C, ...
 +------> C,X,0,0,X,C  <--------->                  offset = 0, (0 - 1) mod 6 = 5
 | +----> X,C,C,X,0,0          <--------->          offset = 4, (4 - 1) mod 6 = 3
 | | +--> 0,0,X,C,C,X      <--------->              offset = 2, (2 - 1) mod 6 = 1
 | | |
(C,X,0) for   0 ≤ H <  60
(X,C,0) for  60 ≤ H < 120
(0,C,X) for 120 ≤ H < 180
(0,X,C) for 180 ≤ H < 240
(X,0,C) for 240 ≤ H < 300
(C,0,X) for 300 ≤ H < 360

হায় গ্রহণ Hমধ্যে [0,6)এবং outputting [0,1]কিছু বাইট সংরক্ষণ করবেন?
জোনাথন অ্যালান

@ জোনাথান অ্যালান আহ, আমি লক্ষ্য করিনি যে I / O ফর্ম্যাটটি শিথিল ছিল। ধন্যবাদ!
আর্নৌল্ড

4

গণিত, 155 বাইট

(x~Clear~c;d=Piecewise@Table[{(P=Permutations)[P@{c,x,0}][[42,i]],(i-1)<=#<i*p},{i,6}];c=(1-Abs[2#3-1])#2;x=c(1-Abs[Mod[#/(p=60),2]-1]);m=#3-c/2;(m+d)255)&


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



1
@ টোটালিহুমান আমি Hueএইচএসবি (একেএ এইচএসভি) ঠিক এইচএসএল হিসাবে ঠিক মনে করি না (লিঙ্কযুক্ত উইকিপিডিয়া পৃষ্ঠায় 2a এবং 2b চিত্র দেখুন)।
জোনাথন অ্যালান

1
জেনি - যদি এটি ঠিক হয় তবে নীচে আপনার অ-বিল্টের সাথে বাইট গণনা হিসাবে এটি পোস্ট করার কোনও কারণ নেই!
জোনাথন অ্যালান

1
@ জোনাথন অ্যালান ওহ, তাই হয়। এটি কীভাবে RGBColorবিদ্যমান তা সামান্য বিরক্তিকর HSLColor। > _>
সম্পূর্ণমানবিক

এটির কোনও দালাল সংস্করণ আছে?
ব্যবহারকারী 76284

4

পাইথন 2 , 32 বাইট

from colorsys import*;hls_to_rgb

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

এই কার্যকারিতাটি লাইব্রেরির hls_to_rgbঅভ্যন্তর দিয়ে পাইথনে নির্মিত হয়েছিল colorsys। ফর্ম্যাট খনি ইনপুটগুলি এইচএলএসের 0-1 ব্যাপ্তি (এইচএসএল এর পরিবর্তে, উভয়ই একই জিনিসটির সাধারণ সংক্ষিপ্ত নাম [যদিও, এইচএসএল আরও সাধারণ])। এবং খনি 0 থেকে 1 এর পরিসীমা বিশিষ্ট একটি আরগিজি মানগুলিকে আউটপুট করে।

ক্রেডিট

জোনাথন অ্যালানকে এটি নির্দেশ করার জন্য ধন্যবাদ যে আমাকে কেবল এটি আমদানি করতে হবে (এবং তারপরে আমাকে আরও বাইট গণনা হ্রাস করতে সহায়তা করবে)।


আমি মনে করি এটি কেবল 31 বাইট হতে পারে from colorsys import hls_to_rgbকারণ আমাদের ফাংশন দেয় যা পুনরায় ব্যবহার করা যেতে পারে। সম্পাদনা করুন - 21 হিসাবে এটি করুন from colorsys import*
জোনাথন অ্যালান

1
@ জোনাথান অ্যালান ধন্যবাদ, আপডেট হয়েছে।
নীল

আসলে সম্ভবত import colorsys15 এর জন্য!
জোনাথন অ্যালান

@ জোনাথান অ্যালান নিস, আবার আপডেট হয়েছে।
নীল

1
তবে এটি সত্য হতে পারে, আমি মনে করি এটি কোডগল্ফিংয়ের স্পিরিটকে কিছুটা বেশি প্রভাবিত করে: /
তোয়াক

4

সি ++, 228 221 বাইট

-7 বাইট জ্যাকারিকে ধন্যবাদ ý

#define S(o,n)r[t[int(h[0])/60*3+o]+o-2]=(n+h[2]-c/2)*255;
void C(float*h,int*r){float g=2*h[2]-1,c=(g<0?1+g:1-g)*h[1],a=int(h[0])%120/60.f-1;int t[]={2,2,2,3,1,2,3,3,0,4,2,0,4,1,1,2,3,1};S(0,c)S(1,c*(a<0?1+a:1-a))S(2,0)}

যুক্তিগুলি উভয় অ্যারে যা সর্বনিম্ন আকারের 3 টি উপাদান থাকে (যেমন float hsl[3]এবং এবং)int rgb[3]

ঠিক আছে. এখন, কিভাবে এটি কাজ করে? এই দীর্ঘ অ্যারে কি?

ভাল, এটি দীর্ঘ অ্যারে নয়, এটি একটি intঅ্যারে। কৌতুকের একদিকে, অ্যারেটি কতটা পজিশন দ্বারা সিএক্স এবং 0 টি শিফট করে যখন আমরা সঠিক অনুচ্ছেদটি নির্বাচন করতে চাইছি তা নির্দেশ করে, + ২. কীভাবে আর ', জি' এবং বি 'নির্বাচিত হয় তা মনে রাখবেন?

কীভাবে আর ', জি' এবং বি 'নির্বাচন করা হয়

ধরা যাক আমাদের একটি "স্বাভাবিক" অর্ডার রয়েছে যা {C, X, 0 is

এখন, যখন প্রথম ক্রমান্বন (যেমন {সি, এক্স, ০}) নির্বাচিত হবে, আপনাকে শিফট করার দরকার নেই যা ডান স্থানান্তর 0 এর ঠিক একই জিনিস 0 সুতরাং অ্যারের প্রথম 3 উপাদান 0,0 এবং 0

দ্বিতীয় অনুক্রমের জন্য ({এক্স, সি, 0}), আমাদের সি দ্বারা ডান শিফটটি 1 এবং বাম শিফট এক্স -1 দ্বারা হওয়া দরকার, সুতরাং অ্যারের চতুর্থ, পঞ্চম এবং ষষ্ঠ উপাদানটি 1, -1 এবং 0 হয়

এবং আরও ...

তৃতীয় এবং চতুর্থ ক্রমশক্তিটির ক্ষেত্রে, আমার 0 থেকে 2 বাম শিফট করতে হবে, তাই ডান শিফট -2 দ্বারা চালিত হওয়া উচিত। যেহেতু আরও 2 টি সংখ্যা নেতিবাচক রয়েছে তাই আমি অ্যারের প্রতিটি উপাদানগুলিতে 2 টি যুক্ত করি এবং রানটাইমের সময় 2 টি সংশ্লেষ করি (গল্ফিং কারণে, অ্যারেতে পুরো সংখ্যা থাকতে পারে)।


221 বাইট: পেস্টবিন.
com


3

এইচটিএমএল + জাভাস্ক্রিপ্ট (ES6), 8 + 88 = 96 বাইট

f=
(h,s,l)=>(p.style.color=`hsl(${h},${s}%,${l}%)`,getComputedStyle(p).color.match(/\d+/g))
<div oninput=o.textContent=f(h.value,s.value,l.value)>H: <input type=number min=0 max=360 value=0 id=h>°<br>S: <input type=number min=0 max=100 value=0 id=s>%<br>L: <input type=number min=0 max=100 value=0 id=l>%<pre id=o>0,0,0</pre>
<p id=p>

একটি কোণ এবং দুই শতাংশ হিসাবে ইনপুট নেয়। আমি এইচটিএমএল স্নিপেট <p id=p>এবং জাভাস্ক্রিপ্ট তীর ফাংশন স্কোর করছি । রাউন্ডিং ব্রাউজারগুলি কী ব্যবহার করে তা আমি জানি না, তাই আমার উত্তরগুলি আপনার থেকে কিছুটা আলাদা হতে পারে।


2

সুইফট 4, 218 বাইট

[0,1] পরিসীমাতে এইচএসএল মানকে আর্গুমেন্ট হিসাবে গ্রহণ করে এবং একই ব্যাপ্তিতে আরজিবি মান যুক্ত একটি অ্যারে প্রদান করে:

import Cocoa;typealias F=CGFloat;func f(h:F,s:F,l:F)->[F]{var r=F(),g=F(),b=F(),x=s*min(1-l,l),n=2*x/max(l+x,1e-9);NSColor(hue:h,saturation:n,brightness:l+x,alpha:1).getRed(&r,green:&g,blue:&b,alpha:nil);return[r,g,b]}

ধারণাটি হ'ল প্রথমে এইচএসএল থেকে এইচএসবিতে ইনপুট রূপান্তর করা, তারপরে আরজিবি মানগুলি পুনরুদ্ধার করতে কোকোয় অন্তর্নির্মিত রঙের অবজেক্টের এইচএসবি কনস্ট্রাক্টর ব্যবহার করে।

ইউআইকিট সংস্করণটি হ'ল একই দৈর্ঘ্য, কেবলমাত্র প্রতিস্থাপনগুলি হ'ল:

  • CocoaUIKit
  • NSColorUIColor

Ungolfed:

#if os(iOS)
    import UIKit
    typealias Color = UIColor
#elseif os(OSX)
    import Cocoa
    typealias Color = NSColor
#endif

typealias F = CGFloat

func f(h: F,s: F,l: F) -> [F] {
    var r = F(), g = F(), b = F()

    let x = s * min(1 - l, l)
    let n = 2 * x / max(l + x, 1e-9)

    let color = Color(hue: h, saturation: n, brightness: l + x, alpha: 1)
    color.getRed(&r, green: &g,blue: &b, alpha: nil)

    return [r, g, b]
}

নিম্নলিখিত স্নিপেট পরীক্ষা, শুধু মান প্রতিস্থাপন ব্যবহার করা যেতে পারে h, sএবং l:

let h: CGFloat = 0
let s: CGFloat = 0
let l: CGFloat = 0

let result = f(h: h/360, s: s/100, l: l/100).map { Int(round($0*255)) }
print(result)

দুর্ভাগ্যক্রমে আমি কোনও অনলাইন স্যান্ডবক্সের লিঙ্ক সরবরাহ করতে পারি না, যেহেতু এগুলি সমস্তই লিনাক্সে চলে, যার মধ্যে কোকো অন্তর্ভুক্ত নয়।


2

GLSL (GL_ES) 160 144 134 131 বাইট

হিউ 0-6 রেঞ্জের (3 বাইট সংরক্ষণ করে)
শনি, হালকা এবং আরজিবি 0-1 হয়

vec3 f(vec3 c){return mix(c.bbb,mix(clamp(vec3(-1,2,2)-abs(c.r-vec3(3,2,4))*vec3(-1,1,1),0.,1.),vec3(c.b>.5),abs(.5-c.b)*2.),c.g);}

শেডারগুলির বইয়ে এটি ব্যবহার করে দেখুন


202 19 39 → 81 104 118 এ একটি ক্ষুদ্র ত্রুটি ব্যতীত আউটপুটটি সঠিক যা ছিল তা পরীক্ষার জন্য একটি প্রিন্ট স্ক্রিনে রঙিন পিকার সরঞ্জাম ব্যবহার করা হয়েছিল , যা 80 104 118 দিয়েছে


1

আর , 88 বাইট

function(h,s,l){v=(2*l+s*(1-abs(2*l-1)))/2;col2rgb(hsv(h,ifelse(v==0,v,(2*(v-l))/v),v))}

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

এই ফাংশনটি এইচ, এস এবং এল এর মানগুলিকে 0-1 রেঞ্জযুক্ত মান হিসাবে ইনপুট হিসাবে নেয় এবং আরজিবি মান 0-255 রেঞ্জ মান হিসাবে আউটপুট করে। এটি এইচএসএল প্রতিনিধিত্বকে এইচএসভি উপস্থাপনায় hsv()রূপান্তর করে , তারপরে এইচএসভি উপস্থাপনাটিকে আর রঙে (যেমন হেক্স প্রতিনিধিত্ব - #rrggbb) col2rgb()রূপান্তর করে , তারপরে আর রঙকে আরজিবি মানগুলিতে রূপান্তর করতে ব্যবহার করে।


1

জেলি ,  39  32 বাইট

-1 কেয়ার্ড কইনারিংহাহিংকে ধন্যবাদ ( %2ন্যায়সঙ্গত) )
-1 এবং / অথবা অনুপ্রেরণার জন্য -4 কেয়ারড কইনারিংহিংকেও ধন্যবাদ !

Ḥ;Ḃ’ACש"⁵×\;0+³_®H¤⁴Ḟị336Œ?¤¤œ?

একটি সম্পূর্ণ প্রোগ্রাম যা তিনটি কমান্ড লাইন আর্গুমেন্ট গ্রহণ করে:

  • L, H,S রেঞ্জ [0,1), [0,6)এবং [0,1)যথাক্রমে

যা আরজিবি ফর্ম্যাট হিসাবে একটি তালিকা প্রিন্ট করে

  • [R, G, B] ব্যাপ্তি তিনটি মান প্রতিটি সঙ্গে [0,1]

বিঃদ্রঃ: H ঠিক মতো মোড়ানোও হতে পারে [0,360)

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

কিভাবে?

Ḥ;Ḃ’ACש"⁵×\;0+³_®H¤⁴Ḟị336Œ?¤¤œ? - Main link: number, L (in [0,1]); number, H (in [0,6))
Ḥ                                - double                 =     2L
  Ḃ                              - modulo by 2            =              H%2
 ;                               - concatenate            = [   2L   ,   H%2]

   ’                             - decrement              = [   2L-1 ,   H%2-1]
    A                            - absolute               = [  |2L-1|,  |H%2-1|]
     C                           - complement             = [1-|2L-1|,1-|H%2-1|]
                                 -                        = [C/S     ,C/X]
         ⁵                       - 3rd program argument   = S  (in [0,1])
        "                        - zip with:
      ×                          -   multiplication       = [C,C/X]
       ©                         -   (copy the result, C, to the register)
           \                     - cumulative reduce with:
          ×                      -   multiplication       = [C, C/X*C] = [C,X]
            ;0                   - concatenate zero       = [C,X,0]
               ³                 - 1st program argument   = L
              +                  - add (vectorises)       = [C+L,X+L,L]
                   ¤             - nilad followed by link(s) as a nilad:
                 ®               -   recall from register = C
                  H              -   halve                = C/2
                _                - subtract               = [C+L-C/2,X+L-C/2,L-C/2]
                             ¤   - nilad followed by link(s) as a nilad:
                    ⁴            -   2nd program argument = H
                     Ḟ           -   floor                = floor(H)
                            ¤    -   nilad followed by link(s) as a nilad:
                       336       -     literal 336
                          Œ?     -     Shortest permutation of natural numbers with a
                                 -     lexicographical index of 336 in all permutations
                                 -     thereof            = [3,5,6,4,2,1]
                      ị          -   index into (1-indexed & modular)
                              œ? - get that permutation of [C+L-C/2,X+L-C/2,L-C/2]
                                 - implicit print

উফ, অবশ্যই। ধন্যবাদ!
জোনাথন অ্যালান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.