প্রোগ্রামিয়ালি একটি হেক্স রঙ হালকা বা গাark় করুন (বা আরজিবি, এবং মিশ্রিত রং)


503

এখানে একটি ফাংশন যা আমি একটি নির্দিষ্ট পরিমাণে একটি হেক্স রঙটি প্রোগ্রামালিকভাবে হালকা বা গাen় করার জন্য কাজ করছিলাম। "3F6D2A"রঙটি ( col) এবং বেস 10 পূর্ণসংখ্যার ( amt) হালকা বা গাen় করার জন্য কেবল স্ট্রিংয়ের মধ্যে দিয়ে দিন । গাen় হতে, একটি নেতিবাচক সংখ্যায় (যেমন -20) পাস করুন ।

আমার এটি করার কারণটি হ'ল আমি যে সকল সমাধান পেয়েছি তা এই পর্যন্ত, তারা মনে হয়েছিল যে বিষয়টি খুব জটিল করে তুলেছে। এবং আমার মনে হয়েছে এটি কোডের কয়েকটি লাইন দিয়ে সম্পন্ন করা যেতে পারে। আপনি যদি কোনও সমস্যা পান বা এটির গতি বাড়িয়ে তুলতে কোনও সামঞ্জস্য রেখে থাকেন তবে দয়া করে আমাকে জানান।

function LightenDarkenColor(col, amt) {
  col = parseInt(col, 16);
  return (((col & 0x0000FF) + amt) | ((((col >> 8) & 0x00FF) + amt) << 8) | (((col >> 16) + amt) << 16)).toString(16);
}


// TEST
console.log( LightenDarkenColor("3F6D2A",40) );

উন্নয়নের জন্য এখানে সংস্করণটি পড়া সহজ is

function LightenDarkenColor(col, amt) {
  var num = parseInt(col, 16);
  var r = (num >> 16) + amt;
  var b = ((num >> 8) & 0x00FF) + amt;
  var g = (num & 0x0000FF) + amt;
  var newColor = g | (b << 8) | (r << 16);
  return newColor.toString(16);
}


// TEST
console.log(LightenDarkenColor("3F6D2A", -40));

এবং পরিশেষে রঙগুলি হ্যান্ডেল করার জন্য একটি সংস্করণ রয়েছে যা শুরুর দিকে "#" থাকতে পারে। অনুপযুক্ত রঙ মানগুলির জন্য প্লাস সমন্বয়:

function LightenDarkenColor(col,amt) {
    var usePound = false;
    if ( col[0] == "#" ) {
        col = col.slice(1);
        usePound = true;
    }

    var num = parseInt(col,16);

    var r = (num >> 16) + amt;

    if ( r > 255 ) r = 255;
    else if  (r < 0) r = 0;

    var b = ((num >> 8) & 0x00FF) + amt;

    if ( b > 255 ) b = 255;
    else if  (b < 0) b = 0;

    var g = (num & 0x0000FF) + amt;

    if ( g > 255 ) g = 255;
    else if  ( g < 0 ) g = 0;

    return (usePound?"#":"") + (g | (b << 8) | (r << 16)).toString(16);
}

ঠিক আছে, সুতরাং এখন এটি কেবল কয়েকটি লাইন নয়, তবে এটি অনেক সহজ বলে মনে হচ্ছে এবং যদি আপনি "#" ব্যবহার করেন না এবং রঙের বাইরেও পরীক্ষা করার প্রয়োজন না হয় তবে এটি কেবল কয়েক লাইন is

যদি "#" ব্যবহার না করে থাকেন তবে আপনি কেবল কোডে এটি যুক্ত করতে পারেন:

var myColor = "3F6D2A";
myColor = LightenDarkenColor(myColor,10);
thePlaceTheColorIsUsed = ("#" + myColor);

আমার অনুমান আমার মূল প্রশ্নটি, আমি কি এখানে ঠিক আছি? এটি কিছু (সাধারণ) পরিস্থিতি ঘিরে রাখে না?


1
রঙগুলি সংশোধন করার সময় আপনি যদি প্রত্যাশিত ফলাফল না পান তবে আমি ল্যাব রঙের স্থানটি অনুসন্ধান করার পরামর্শ দিচ্ছি যা মানব দর্শনের কাছাকাছি। অনেক ভাষায় রূপান্তর করার জন্য লাইব্রেরি রয়েছে। আমার অভিজ্ঞতায় বিশেষ করে কমলার শেডগুলি গা .় হওয়া বা হালকা করার সময় সমস্যা হতে পারে।
হেনরিক

খুব ভাল পয়েন্ট। তবে, এই প্রশ্নের মূল উদ্দেশ্যটি ছিল প্রথমত, দ্রুততম রানটাইম এবং ক্ষুদ্রতম আকারের সূত্রটি ... এবং দ্বিতীয়ত, এর যথার্থতা। সুতরাং, কেন আমি এইচএসএল বা যে কোনও কিছুতে রূপান্তর করলাম না। এখানে গতি এবং আকার আরও গুরুত্বপূর্ণ। তবে, আপনি সূত্রটি আমার 2 সংস্করণ দিয়ে দেখতে পারেন। শেডে এলইআরপি ব্যবহারের ফলে ছায়ার পরিসর ছাড়িয়ে মনোরম কমলা হবে। নীচের রঙিন চার্টটি একবার দেখুন এবং আমাকে জানাতে shade ছায়ার পরিসরটি সত্যিকারের খুব কাছাকাছি রঙিন নয়।
পিম্প ট্রাইজকিট

আমি এখানে কাঠামোর সাথে কিছুটা বিভ্রান্ত হয়ে পড়েছি, তবে আপনি ঠিক বলেছেন, শেড কালার 1 এর জন্য কমলা স্তরগুলি খুব ভাল বলে মনে হচ্ছে।
হেনরিক

লোল, আপনি ছায়া রঙ 2 বোঝাতে চাইছেন। আমার ধারণা আপনি যে কাঠামোর কথা বলছেন তা কি উত্তরটির সামগ্রিক বিন্যাস? আরও পরিষ্কার করার জন্য কোনও ইঙ্গিত?
পিম্প ট্রাইজকিট

3
উপরের # টির সাথে ফাংশনটিতে কেবল একটি সমস্যা রয়েছে এটি যদি চূড়ান্ত হেক্স কোডটি শূন্যগুলির সাথে শুরু হয় তবে এটি নেতৃস্থানীয় শূন্যগুলি তৈরি করে না। উদাহরণস্বরূপ, যদি হেক্স কোডটি # 00a6b7 হয় তবে এটি এটি # a6b7 হিসাবে আউটপুট দেবে, যা সিএসএস হিসাবে ব্যবহার করে কাজ করবে না। আপনি এর মাধ্যমে রিটার্ন লাইনটি প্রতিস্থাপন করে এটি সংশোধন করতে পারেন: var স্ট্রিং = "000000" + (জি | (বি << 8) | (আর << 16))। টু স্ট্রিং (16); রিটার্ন (ইউজপাউন্ড? "#": "") + স্ট্রিং.সুবস্ট্র (স্ট্রিং.লেন্থ -6);
রাফেল লেভি

উত্তর:


876

ঠিক আছে, এই উত্তরটি তার নিজের জন্তুতে পরিণত হয়েছে। অনেকগুলি নতুন সংস্করণ, এটি মূর্খ হয়ে উঠছিল। এই উত্তরে দুর্দান্ত অবদানকারীদের সবাইকে অনেক ধন্যবাদ। তবে এটি সাধারণের জন্য সহজ রাখার জন্য। আমি এই উত্তরটির বিবর্তনের সমস্ত সংস্করণ / ইতিহাস আমার গিথুবে সংরক্ষণাগারভুক্ত করেছি । এবং এটি স্ট্যাক ওভারফ্লোতে নতুন সংস্করণ দিয়ে এটিকে পরিষ্কার করে শুরু করে। এই সংস্করণটির জন্য মাইক 'পোম্যাক্স' কামারম্যান্সকে একটি বিশেষ ধন্যবাদ জানানো হয়েছে। তিনি আমাকে নতুন গণিত দিয়েছেন।


এই ফাংশনটি ( pSBC) একটি HEX বা আরজিবি ওয়েব রঙ নেবে। pSBCএটি গা dark় বা হালকা শেড করতে পারে, বা এটি দ্বিতীয় রঙের সাথে মিশ্রিত করতে পারে এবং এটিকে ডান দিক দিয়েও পাস করতে পারে তবে হেক্স থেকে আরজিবি (হেক্স 2 আরজিবি) বা আরজিবিতে হেক্স (আরজিবি 2 হেক্স) রূপান্তর করতে পারে। আপনি কোন রঙিন ফর্ম্যাটটি ব্যবহার করছেন তা না জেনেও সবাই।

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

এই ফাংশনটিতে লগ মিশ্রণ বা লিনিয়ার মিশ্রণ ব্যবহার করা হয়। তবে কোনও রঙ হালকা বা গা or় করার জন্য এটি এইচএসএল রূপান্তর করে না। অতএব, এই ফাংশন থেকে প্রাপ্ত ফলাফলগুলি এইচএসএল ব্যবহারকারী অনেক বৃহত্তর এবং ধীর গতির থেকে পৃথক হবে

জেএসফিডেল পিএসবিসির সাথে

github> পিএসবিসি উইকি

বৈশিষ্ট্য:

  • স্ট্রিং আকারে স্ট্যান্ডার্ড হেক্স রঙগুলি স্বতঃ-সনাক্ত করে এবং গ্রহণ করে। যেমন: "#AA6622"বা "#bb551144"
  • স্ট্রিং আকারে মানক আরজিবি রঙগুলি স্বতঃ-সনাক্ত করে এবং গ্রহণ করে। যেমন: "rgb(123,45,76)"বা "rgba(45,15,74,0.45)"
  • শতাংশে শ্বেত বা কালো রঙের ছায়া গো।
  • শতাংশ ভাগ করে একত্রিত করে রঙগুলি।
  • হেক্স 2 আরজিবি এবং আরজিবি 2 হেক্স একই সময়ে রূপান্তর করতে পারে বা একক।
  • # আরজিবি (বা # আরজিবিএ) আকারে 3 ডিজিটের (বা 4 অঙ্কের ডাব্লু / আলফা) এইচএক্স বর্ণ কোডগুলি গ্রহণ করে। এটি তাদের প্রসারিত করবে। উদাহরণস্বরূপ: "#C41"হয়ে যায় "#CC4411"
  • গ্রহণ এবং (লিনিয়ার) আলফা চ্যানেলগুলির মিশ্রণ করে। যদি হয়c0 (থেকে) রঙ বা (থেকে) রঙের c1একটিতে আলফা চ্যানেল থাকে তবে প্রত্যাবর্তিত রঙের একটি আলফা চ্যানেল থাকবে। যদি উভয় রঙের একটি আলফা চ্যানেল থাকে, তবে প্রদত্ত শতাংশটি প্রদত্ত শতাংশ (যেমন এটি একটি সাধারণ রঙের চ্যানেল হিসাবে ছিল) ব্যবহার করে দুটি আলফা চ্যানেলের লিনিয়ার মিশ্রণ হবে nd যদি দুটি বর্ণের একটিরও একটি আলফা চ্যানেল থাকে তবে এই আলফাটি কেবলমাত্র ফিরে আসা রঙের মধ্য দিয়ে যাবে। এটি স্বচ্ছতার স্তর বজায় রেখে স্বচ্ছ রঙ মিশ্রিত করতে / শেড করতে দেয়। বা, যদি স্বচ্ছতার স্তরগুলিও মিশ্রিত হয় তবে নিশ্চিত হয়ে নিন যে উভয় বর্ণের বর্ণমালা রয়েছে। শেড করার সময়, এটি আলফা চ্যানেলটি সোজা হয়ে পাস করবে। আপনি যদি বেসিক শেডগুলি চান যা আলফা চ্যানেলকেও শেড করে, তবে ব্যবহার করুন rgb(0,0,0,1)বা rgb(255,255,255,1)আপনার হিসাবেc1(থেকে) রঙ (বা তাদের হেক্স সমতুল্য)। আরজিবি রঙের জন্য, ফিরে আসা রঙের আলফা চ্যানেলটি 3 দশমিক স্থানে গোল করা হবে।
  • মিশ্রণটি ব্যবহার করার সময় আরজিবি 2 হেক্স এবং হেক্স 2 আরজিবি রূপান্তরগুলি অন্তর্ভুক্ত। c0(থেকে) রঙ নির্বিশেষে ; প্রত্যাবর্তিত রঙটি সর্বদা c1(থেকে) রঙের বর্ণ বিন্যাসে থাকবে , যদি কোনও উপস্থিত থাকে। যদি কোনও c1(টু) রঙ 'c'না থাকে তবে c1রঙ হিসাবে প্রবেশ করুন এবং এটি ছায়াযুক্ত হবে এবং c0রঙ যাই হোক না কেন তা রূপান্তরিত করবে । যদি রূপান্তরটি কেবল পছন্দসই 0হয় তবে শতাংশ হিসাবেও পাস করুন ( p)। যদি c1রঙ বাদ দেওয়া হয় বা একটি নন- stringপাস করা হয় তবে তা রূপান্তরিত হবে না।
  • গ্লোবাল পাশাপাশি একটি গৌণ ফাংশন যুক্ত করা হয়। pSBCrএকটি হেক্স বা আরজিবি রঙ পাস করা যেতে পারে এবং এটি এই রঙের তথ্য সম্বলিত কোনও বস্তু প্রদান করে। এটি আকারে: {r: XXX, g: XXX, b: XXX, a: X.XXX}} যেখানে .r, .gএবং এর .bপরিধি 0 থেকে 255 রয়েছে And এবং যখন কোনও আলফা নেই: .a-1 হয়। অন্যথায়: .aএর পরিধি 0.000 থেকে 1.000 রয়েছে।
  • আরজিবি আউটপুটের জন্য, যখন আলফা চ্যানেলের সাথে একটি রঙ (থেকে) এবং / অথবা ( থেকে) প্রবেশ করা rgba()হয় rgb()তখন এটি শেষ হয়ে যায় ।c0c1
  • মাইনর ত্রুটি পরীক্ষা করা যুক্ত করা হয়েছে। এটি নিখুঁত নয়। এটি এখনও ক্র্যাশ বা জিব্বারিশ তৈরি করতে পারে। তবে এতে কিছু জিনিস ধরা পড়বে। মূলত, যদি কাঠামোটি কিছু উপায়ে ভুল হয় বা শতাংশ যদি সংখ্যা না হয় বা সুযোগের বাইরে থাকে তবে এটি ফিরে আসবে null। একটি উদাহরণ: pSBC(0.5,"salt") == nullযেখানে এটি #saltবৈধ রঙ হিসাবে মনে করে । return null;এই বৈশিষ্ট্যটি সরাতে এবং এটিকে আরও দ্রুত এবং আরও ছোট করার জন্য শেষ হওয়া চারটি লাইন মুছুন ।
  • লগ মিশ্রণ ব্যবহার করে। পাশ trueজন্য lলিনিয়ার মিশ্রণ ব্যবহার করতে (4 র্থ প্যারামিটার)।

কোড:

// Version 4.0
const pSBC=(p,c0,c1,l)=>{
    let r,g,b,P,f,t,h,i=parseInt,m=Math.round,a=typeof(c1)=="string";
    if(typeof(p)!="number"||p<-1||p>1||typeof(c0)!="string"||(c0[0]!='r'&&c0[0]!='#')||(c1&&!a))return null;
    if(!this.pSBCr)this.pSBCr=(d)=>{
        let n=d.length,x={};
        if(n>9){
            [r,g,b,a]=d=d.split(","),n=d.length;
            if(n<3||n>4)return null;
            x.r=i(r[3]=="a"?r.slice(5):r.slice(4)),x.g=i(g),x.b=i(b),x.a=a?parseFloat(a):-1
        }else{
            if(n==8||n==6||n<4)return null;
            if(n<6)d="#"+d[1]+d[1]+d[2]+d[2]+d[3]+d[3]+(n>4?d[4]+d[4]:"");
            d=i(d.slice(1),16);
            if(n==9||n==5)x.r=d>>24&255,x.g=d>>16&255,x.b=d>>8&255,x.a=m((d&255)/0.255)/1000;
            else x.r=d>>16,x.g=d>>8&255,x.b=d&255,x.a=-1
        }return x};
    h=c0.length>9,h=a?c1.length>9?true:c1=="c"?!h:false:h,f=this.pSBCr(c0),P=p<0,t=c1&&c1!="c"?this.pSBCr(c1):P?{r:0,g:0,b:0,a:-1}:{r:255,g:255,b:255,a:-1},p=P?p*-1:p,P=1-p;
    if(!f||!t)return null;
    if(l)r=m(P*f.r+p*t.r),g=m(P*f.g+p*t.g),b=m(P*f.b+p*t.b);
    else r=m((P*f.r**2+p*t.r**2)**0.5),g=m((P*f.g**2+p*t.g**2)**0.5),b=m((P*f.b**2+p*t.b**2)**0.5);
    a=f.a,t=t.a,f=a>=0||t>=0,a=f?a<0?t:t<0?a:a*P+t*p:0;
    if(h)return"rgb"+(f?"a(":"(")+r+","+g+","+b+(f?","+m(a*1000)/1000:"")+")";
    else return"#"+(4294967296+r*16777216+g*65536+b*256+(f?m(a*255):0)).toString(16).slice(1,f?undefined:-2)
}

ব্যবহার:

// Setup:

let color1 = "rgb(20,60,200)";
let color2 = "rgba(20,60,200,0.67423)";
let color3 = "#67DAF0";
let color4 = "#5567DAF0";
let color5 = "#F3A";
let color6 = "#F3A9";
let color7 = "rgb(200,60,20)";
let color8 = "rgba(200,60,20,0.98631)";

// Tests:

/*** Log Blending ***/
// Shade (Lighten or Darken)
pSBC ( 0.42, color1 ); // rgb(20,60,200) + [42% Lighter] => rgb(166,171,225)
pSBC ( -0.4, color5 ); // #F3A + [40% Darker] => #c62884
pSBC ( 0.42, color8 ); // rgba(200,60,20,0.98631) + [42% Lighter] => rgba(225,171,166,0.98631)

// Shade with Conversion (use "c" as your "to" color)
pSBC ( 0.42, color2, "c" ); // rgba(20,60,200,0.67423) + [42% Lighter] + [Convert] => #a6abe1ac

// RGB2Hex & Hex2RGB Conversion Only (set percentage to zero)
pSBC ( 0, color6, "c" ); // #F3A9 + [Convert] => rgba(255,51,170,0.6)

// Blending
pSBC ( -0.5, color2, color8 ); // rgba(20,60,200,0.67423) + rgba(200,60,20,0.98631) + [50% Blend] => rgba(142,60,142,0.83)
pSBC ( 0.7, color2, color7 ); // rgba(20,60,200,0.67423) + rgb(200,60,20) + [70% Blend] => rgba(168,60,111,0.67423)
pSBC ( 0.25, color3, color7 ); // #67DAF0 + rgb(200,60,20) + [25% Blend] => rgb(134,191,208)
pSBC ( 0.75, color7, color3 ); // rgb(200,60,20) + #67DAF0 + [75% Blend] => #86bfd0

/*** Linear Blending ***/
// Shade (Lighten or Darken)
pSBC ( 0.42, color1, false, true ); // rgb(20,60,200) + [42% Lighter] => rgb(119,142,223)
pSBC ( -0.4, color5, false, true ); // #F3A + [40% Darker] => #991f66
pSBC ( 0.42, color8, false, true ); // rgba(200,60,20,0.98631) + [42% Lighter] => rgba(223,142,119,0.98631)

// Shade with Conversion (use "c" as your "to" color)
pSBC ( 0.42, color2, "c", true ); // rgba(20,60,200,0.67423) + [42% Lighter] + [Convert] => #778edfac

// RGB2Hex & Hex2RGB Conversion Only (set percentage to zero)
pSBC ( 0, color6, "c", true ); // #F3A9 + [Convert] => rgba(255,51,170,0.6)

// Blending
pSBC ( -0.5, color2, color8, true ); // rgba(20,60,200,0.67423) + rgba(200,60,20,0.98631) + [50% Blend] => rgba(110,60,110,0.83)
pSBC ( 0.7, color2, color7, true ); // rgba(20,60,200,0.67423) + rgb(200,60,20) + [70% Blend] => rgba(146,60,74,0.67423)
pSBC ( 0.25, color3, color7, true ); // #67DAF0 + rgb(200,60,20) + [25% Blend] => rgb(127,179,185)
pSBC ( 0.75, color7, color3, true ); // rgb(200,60,20) + #67DAF0 + [75% Blend] => #7fb3b9

/*** Other Stuff ***/
// Error Checking
pSBC ( 0.42, "#FFBAA" ); // #FFBAA + [42% Lighter] => null  (Invalid Input Color)
pSBC ( 42, color1, color5 ); // rgb(20,60,200) + #F3A + [4200% Blend] => null  (Invalid Percentage Range)
pSBC ( 0.42, {} ); // [object Object] + [42% Lighter] => null  (Strings Only for Color)
pSBC ( "42", color1 ); // rgb(20,60,200) + ["42"] => null  (Numbers Only for Percentage)
pSBC ( 0.42, "salt" ); // salt + [42% Lighter] => null  (A Little Salt is No Good...)

// Error Check Fails (Some Errors are not Caught)
pSBC ( 0.42, "#salt" ); // #salt + [42% Lighter] => #a5a5a500  (...and a Pound of Salt is Jibberish)

// Ripping
pSBCr ( color4 ); // #5567DAF0 + [Rip] => [object Object] => {'r':85,'g':103,'b':218,'a':0.941}

নীচের ছবিটি দুটি মিশ্রনের পদ্ধতির মধ্যে পার্থক্য দেখাতে সহায়তা করবে:


মাইক্রো ফাংশন

আপনি যদি সত্যিই গতি এবং আকার চান তবে আপনাকে আরএইচজি হেক্স নয় ব্যবহার করতে হবে। আরজিবি আরও সোজা ও সরল, এইচএক্স খুব ধীরগতিতে লিখেছে এবং একটি সাধারণ দ্বি-লাইনারের জন্য অনেকগুলি স্বাদে আসে (আই। এটি একটি 3, 4, 6 বা 8 সংখ্যার এইএইএক্স কোড হতে পারে)। আপনাকে কিছু বৈশিষ্ট্য ত্যাগ করতে হবে, কোনও ত্রুটি পরীক্ষা করা নেই, কোনও এইচএক্স 2 আরজিবি বা আরজিবি 2 এইচএক্স নেই। পাশাপাশি, রঙ মিশ্রিত গণিতের জন্য আপনাকে একটি নির্দিষ্ট ফাংশন (নীচে এর ফাংশন নামের উপর ভিত্তি করে) চয়ন করতে হবে এবং আপনি যদি ছায়াছানা বা মিশ্রণ চান want এই ফাংশনগুলি আলফা চ্যানেলগুলিকে সমর্থন করে। এবং যখন উভয় ইনপুট রঙের বর্ণমালা থাকে এটি লিনিয়ার মিশ্রিত করবে। যদি দুটি বর্ণের একটিরও একটি আলফা থাকে তবে এটি এটিকে সরাসরি রঙের মাধ্যমে প্রেরণ করবে। নীচে দুটি লাইনারের ফাংশন রয়েছে যা অবিশ্বাস্যভাবে দ্রুত এবং ছোট:

const RGB_Linear_Blend=(p,c0,c1)=>{
    var i=parseInt,r=Math.round,P=1-p,[a,b,c,d]=c0.split(","),[e,f,g,h]=c1.split(","),x=d||h,j=x?","+(!d?h:!h?d:r((parseFloat(d)*P+parseFloat(h)*p)*1000)/1000+")"):")";
    return"rgb"+(x?"a(":"(")+r(i(a[3]=="a"?a.slice(5):a.slice(4))*P+i(e[3]=="a"?e.slice(5):e.slice(4))*p)+","+r(i(b)*P+i(f)*p)+","+r(i(c)*P+i(g)*p)+j;
}

const RGB_Linear_Shade=(p,c)=>{
    var i=parseInt,r=Math.round,[a,b,c,d]=c.split(","),P=p<0,t=P?0:255*p,P=P?1+p:1-p;
    return"rgb"+(d?"a(":"(")+r(i(a[3]=="a"?a.slice(5):a.slice(4))*P+t)+","+r(i(b)*P+t)+","+r(i(c)*P+t)+(d?","+d:")");
}

const RGB_Log_Blend=(p,c0,c1)=>{
    var i=parseInt,r=Math.round,P=1-p,[a,b,c,d]=c0.split(","),[e,f,g,h]=c1.split(","),x=d||h,j=x?","+(!d?h:!h?d:r((parseFloat(d)*P+parseFloat(h)*p)*1000)/1000+")"):")";
    return"rgb"+(x?"a(":"(")+r((P*i(a[3]=="a"?a.slice(5):a.slice(4))**2+p*i(e[3]=="a"?e.slice(5):e.slice(4))**2)**0.5)+","+r((P*i(b)**2+p*i(f)**2)**0.5)+","+r((P*i(c)**2+p*i(g)**2)**0.5)+j;
}

const RGB_Log_Shade=(p,c)=>{
    var i=parseInt,r=Math.round,[a,b,c,d]=c.split(","),P=p<0,t=P?0:p*255**2,P=P?1+p:1-p;
    return"rgb"+(d?"a(":"(")+r((P*i(a[3]=="a"?a.slice(5):a.slice(4))**2+t)**0.5)+","+r((P*i(b)**2+t)**0.5)+","+r((P*i(c)**2+t)**0.5)+(d?","+d:")");
}

আরও তথ্য চান? পূর্ণ কাজের মধ্যে থাকবেন পড়ুন GitHub

পিটি

(পিএস যদি কারও কাছে অন্য মিশ্রন পদ্ধতিতে গণিত থাকে তবে দয়া করে ভাগ করুন))


8
যাদের প্রয়োজন তাদের জন্য একটি পিএইচপি সংস্করণ: gist.github.com/chaoszcat/5325115#file-gistfile1-php
লিওনেল চ্যান

27
আমি টিনিকালার ব্যবহার করেছি -tinycolor.darken(color,amount);
FWrnr

4
দুর্দান্ত পোস্ট ... :) ... সবেমাত্র এটির সুইফট এক্সটেনশন তৈরি হয়েছে: gist.github.com/matejukmar/1da47f7a950d1ba68a95
মতেজ উকমার

2
আপডেট শেড কালার 2 সংস্করণটির জন্য এখানে পিএইচপি সংস্করণ রয়েছে: function shadeColor2($color, $percent) { $color = str_replace("#", "", $color); $t=$percent<0?0:255; $p=$percent<0?$percent*-1:$percent; $RGB = str_split($color, 2); $R=hexdec($RGB[0]); $G=hexdec($RGB[1]); $B=hexdec($RGB[2]); return '#'.substr(dechex(0x1000000+(round(($t-$R)*$p)+$R)*0x10000+(round(($t-$G)*$p)+$G)*0x100+(round(($t-$B)*$p)+$B)),1); }
কেভিন এম

2
দুঃখিত, আমি স্পষ্টতই এই বিন্দুটি মিস করেছি। এর দুটি কারণ হতে পারে। প্রথম এবং সুস্পষ্ট হ'ল আমি ম্যাথটি ব্যবহার করি R উদাহরণস্বরূপ, যদি রেড চ্যানেলটি থাকে 8তবে 10%আপনাকে যোগ করুন 8.8যা কোন রাউন্ডে যাবে 9। তারপর নিতে 9.09%থেকে দূরে 9এবং আপনি পেতে 8.1819। যেটি ঘুরছে 8তাই এটি একটি খারাপ উদাহরণ। কিন্তু এটি এখনও দেখায় যে, আপনি গ্রহণ করা হয় 9.09%এর 9এবং 8.8। সুতরাং সেখানে কিছু নম্বর থাকতে পারে যা আমার উদাহরণের মতো এখানে ফিরে আসে না।
পিম্প ট্রাইজকিট

121

আমি একটি সমাধান তৈরি করেছি যা আমার পক্ষে খুব সুন্দর কাজ করে:

function shadeColor(color, percent) {

    var R = parseInt(color.substring(1,3),16);
    var G = parseInt(color.substring(3,5),16);
    var B = parseInt(color.substring(5,7),16);

    R = parseInt(R * (100 + percent) / 100);
    G = parseInt(G * (100 + percent) / 100);
    B = parseInt(B * (100 + percent) / 100);

    R = (R<255)?R:255;  
    G = (G<255)?G:255;  
    B = (B<255)?B:255;  

    var RR = ((R.toString(16).length==1)?"0"+R.toString(16):R.toString(16));
    var GG = ((G.toString(16).length==1)?"0"+G.toString(16):G.toString(16));
    var BB = ((B.toString(16).length==1)?"0"+B.toString(16):B.toString(16));

    return "#"+RR+GG+BB;
}

উদাহরণ হালকা:

shadeColor("#63C6FF",40);

উদাহরণস্বরূপ:

shadeColor("#63C6FF",-40);

4
ভাল লাগছে, আমি শতাংশ পছন্দ! +1 থো, আমি R = ((R<255)?R:255).toString(16);তখন R = R.length==1 ? "0"+R : Rগতির জন্য চাই। এবং আমি নিশ্চিত না যে টপআপের কেসটির পয়েন্টটি?
পিম্প ট্রাইজকিট

এটি অপ্রয়োজনীয়। আমি পরীক্ষার সময় কেবল প্রিন্টের জন্য এটি যুক্ত করি। আমি এটি সম্পাদনা করব।
পাবলো

খুব সুন্দর. যাইহোক, 100% হালকা পুরো সাদা এবং 100% অন্ধকার সবসময় কালো হওয়া উচিত না, তা বর্ণ যাই হোক না কেন? দেখে মনে হচ্ছে -100 কোনও রঙ কালো করে তোলে তবে 100 (ধনাত্মক) এটিকে পুরোপুরি সাদা করে না।
কেভিন এম

4
হল # ff0000 মত কঠিন রং দিয়ে স্বল্পতা কাজ, # 00ff00, # 0000ff
Hitori থেকে

এটি কালো রঙ দিয়ে কাজ করতে আমি এই হ্যাকটি কেবল করেছি var R = parseInt(color.substring(1, 3), 16) var G = parseInt(color.substring(3, 5), 16) var B = parseInt(color.substring(5, 7), 16) if (R == 0) R = 32; if (G == 0) G = 32; if (B == 0) B = 32;
ইরফান রাজা

20

এখানে এরিকের উত্তরের উপর ভিত্তি করে একটি সুপার সিম্পল লাইনার রয়েছে

function adjust(color, amount) {
    return '#' + color.replace(/^#/, '').replace(/../g, color => ('0'+Math.min(255, Math.max(0, parseInt(color, 16) + amount)).toString(16)).substr(-2));
}

উদাহরণ:

adjust('#ffffff', -20) => "#ebebeb"
adjust('000000', 20) => "#141414"

7
"সুপার সিম্পল"।
অ্যান্ড্রু

5

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

উদাহরণস্বরূপ, 200 নীল মানের 20% 40 টি নীল মানের 20% এর চেয়ে অনেক বেশি আলাদা।

যাইহোক, এখানে আমার সংশোধন, আপনার মূল ফাংশন জন্য ধন্যবাদ।

function adjustBrightness(col, amt) {

    var usePound = false;

    if (col[0] == "#") {
        col = col.slice(1);
        usePound = true;
    }

    var R = parseInt(col.substring(0,2),16);
    var G = parseInt(col.substring(2,4),16);
    var B = parseInt(col.substring(4,6),16);

    // to make the colour less bright than the input
    // change the following three "+" symbols to "-"
    R = R + amt;
    G = G + amt;
    B = B + amt;

    if (R > 255) R = 255;
    else if (R < 0) R = 0;

    if (G > 255) G = 255;
    else if (G < 0) G = 0;

    if (B > 255) B = 255;
    else if (B < 0) B = 0;

    var RR = ((R.toString(16).length==1)?"0"+R.toString(16):R.toString(16));
    var GG = ((G.toString(16).length==1)?"0"+G.toString(16):G.toString(16));
    var BB = ((B.toString(16).length==1)?"0"+B.toString(16):B.toString(16));

    return (usePound?"#":"") + RR + GG + BB;

}

এটি শীর্ষ উত্তরের চেয়ে অনেক বেশি দরকারী বলে খুঁজে পেয়েছে কারণ শীর্ষ উত্তরটি আমার গা colors় রঙগুলিকে কেবল গাer় করার পরিবর্তে খুব তীব্র করে তুলেছিল। চিয়ার্স এরিক
কীট

4

আমি আপনার ফাংশনটি চেষ্টা করেছিলাম এবং এখানে কিছুটা বাগ হয়েছে: যদি কিছু চূড়ান্ত 'আর' মানটি কেবল 1 ডিজিটের হয় তবে ফলাফলটি এলো: 'a0a0a' যখন সঠিক মানটি '0a0a0a' হয়, উদাহরণস্বরূপ। আমি আপনার ফেরতের পরিবর্তে এটি যুক্ত করে তাড়াতাড়ি স্থির করেছি:

var rStr = (r.toString(16).length < 2)?'0'+r.toString(16):r.toString(16);
var gStr = (g.toString(16).length < 2)?'0'+g.toString(16):g.toString(16);
var bStr = (b.toString(16).length < 2)?'0'+b.toString(16):b.toString(16);

return (usePound?"#":"") + rStr + gStr + bStr;

সম্ভবত এটি এত সুন্দর না তবে এটি কাজ করে। দুর্দান্ত ফাংশন, বিটিডাব্লু। ঠিক যেটা আমার দরকার ছিল. :)


1
ডিবাগ এবং প্রশংসার জন্য ধন্যবাদ! খুব খারাপ এটির কোনও উত্তর নেই যা দ্রুততর উপায় আছে কি না, এটি আমার মূল প্রশ্ন। সমস্ত হেক্স এবং সম্ভবত কোনও বেস রূপান্তর ব্যবহার করে সম্ভবত পছন্দ করুন। থো, আমি অনুমান করি যে আমার কাছে সঠিক কোড (+1) থাকলে আপনি আমাকে বলেছিলেন। দুর্ভাগ্যক্রমে, ফিক্সটি যথেষ্ট বেশি ওভারহেড যুক্ত করেছে (এখন আপনার কলিংটি স্ট্রিং 6 বার হয়েছে), এবং কিছুটা কম KISS। বেস 16 রূপান্তর হওয়ার আগে বেস 10 নম্বরটি 15 বা তার চেয়ে কম কিনা তা খতিয়ে দেখতে আরও দ্রুত হবে। কিন্তু আমি পছন্দ করি!
পিম্প ট্রাইস্কিট

4

আপনি কি একটি rgb> এইচএসএল রূপান্তর সম্পর্কে চিন্তাভাবনা করেছেন? তারপরে শুধু লুমিনোসিটি উপরে এবং নীচে সরানো হবে? আমি যেতে যেভাবে thats।

কিছু অ্যালগরিদমের জন্য তাত্ক্ষণিকভাবে আমাকে নীচের সাইটগুলি পেয়েছে।

পিএইচপি: http://serennu.com/colour/rgbtohsl.php

জাভাস্ক্রিপ্ট: http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in- জাভাস্ক্রিপ্ট

উপরের লিঙ্কটি সম্পাদনা করুন এখন আর বৈধ নয়। আপনার জন্য Git হাব দেখতে পারেন পৃষ্ঠা উত্স বা সারকথা

বিকল্পভাবে অন্য স্ট্যাকওভারফ্লো প্রশ্নটি দেখতে ভাল জায়গা হতে পারে।


যদিও এটি অপির পক্ষে সঠিক পছন্দ নয় নীচেটি কোডটি আমি মূলত প্রস্তাব দিচ্ছিলাম তার একটি অনুমান। (ধরে নিলাম আপনার আরজিবি / এইচএসএল রূপান্তর ফাংশন রয়েছে)

var SHADE_SHIFT_AMOUNT = 0.1; 

function lightenShade(colorValue)
{
    if(colorValue && colorValue.length >= 6)
    {
        var redValue = parseInt(colorValue.slice(-6,-4), 16);
        var greenValue = parseInt(colorValue.slice(-4,-2), 16);
        var blueValue = parseInt(colorValue.slice(-2), 16);

        var hsl = rgbToHsl(redValue, greenValue, blueValue);
        hsl[2]= Math.min(hsl[2] + SHADE_SHIFT_AMOUNT, 1);
        var rgb = hslToRgb(hsl[0], hsl[1], hsl[2]);
        return "#" + rgb[0].toString(16) + rgb[1].toString(16) + rgb[2].toString(16);
    }
    return null;
}

function darkenShade(colorValue)
{
    if(colorValue && colorValue.length >= 6)
    {
        var redValue = parseInt(colorValue.slice(-6,-4), 16);
        var greenValue = parseInt(colorValue.slice(-4,-2), 16);
        var blueValue = parseInt(colorValue.slice(-2), 16);

        var hsl = rgbToHsl(redValue, greenValue, blueValue);
        hsl[2]= Math.max(hsl[2] - SHADE_SHIFT_AMOUNT, 0);
        var rgb = hslToRgb(hsl[0], hsl[1], hsl[2]);
        return "#" + rgb[0].toString(16) + rgb[1].toString(16) + rgb[2].toString(16);
    }
    return null;
}

এটি ধরে নেওয়া হয়:

  1. আপনার ফাংশন আছে hslToRgbএবং rgbToHsl
  2. পরামিতি colorValueআকারে একটি স্ট্রিং #RRGGBB

যদিও আমরা সিএসএস নিয়ে আলোচনা করছি তবে আইই 9 / ক্রোম / ফায়ারফক্সের জন্য এইচএসএল / এইচএসএল উল্লেখ করার জন্য একটি বাক্য গঠন রয়েছে ।


আকর্ষণীয়, তবে কি আমাকে হেক্স স্ট্রিং থেকে আরজিবিতে এইচএসএল রূপান্তর করতে হবে না? এটি আরও জটিল বলে মনে হচ্ছে। হয়তো আমি কিছু মিস করছি। তবে, আমি এটি করার জন্য একটি KISS উপায় খুঁজছি, পাশাপাশি যত তাড়াতাড়ি সম্ভব (কার্যকর করার সময়)। আমি আদর্শভাবে অনুভব করি, যদি আমি হেক্সে এটি করতে পারি তবে এটি সবচেয়ে দ্রুত। তবে, যে সমাধানটি আমি এখানে বিকাশ করেছি তার মধ্যে একটি বাড়তি পরিমাণ যোগ করতে সক্ষম হতে আরজিবিতে যাওয়া জড়িত।
পিম্প ট্রাইস্কিট

হ্যাঁ আমি ধরে নিয়েছি এটি ধীর, আরও জটিল হবে এবং আপনি যদি অন্য কোথাও এইচএসএল রূপান্তর করতে আরজিবি ব্যবহার না করেন তবে সম্ভবত এটি সবচেয়ে সরল সমাধান হতে পারে না। এটি আরজিবি মান যুক্ত করার চেয়ে আরও সঠিক হবে যদিও আমি নিজে কোনও রঙিন ব্যক্তি নই। আমার ধারণা অনুমান করে আপনি কতটা সঠিক হতে চান এটি তার উপর নির্ভর করে।
জেমস খুরি

আপনি যে নির্ভুলতার উল্লেখ করেছেন তার ক্ষতি কী? আমি ধরে নিলাম আপনি বোঝাতে চাইছেন যে সমস্ত [ওয়েব] রঙগুলি আরজিবি বা কোনও কিছুর সাথে পৌঁছানো যায় না?
পিম্প ট্রাইস্কিট

যেমনটি আমি বলেছি আমি রঙ সম্পর্কে তেমন কিছুই জানি না: উইকি রঙ তত্ত্ব
জেমস খুরি

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

2

সি # সংস্করণ ... নোট করুন যে আমি # FF12AE34 এই ফর্ম্যাটে রঙিন স্ট্রিংগুলি পেয়ে যাচ্ছি এবং আপনার # এফএফ কেটে নেওয়া দরকার।

    private string GetSmartShadeColorByBase(string s, float percent)
    {
        if (string.IsNullOrEmpty(s))
            return "";
        var r = s.Substring(3, 2);
        int rInt = int.Parse(r, NumberStyles.HexNumber);
        var g = s.Substring(5, 2);
        int gInt = int.Parse(g, NumberStyles.HexNumber);
        var b = s.Substring(7, 2);
        int bInt = int.Parse(b, NumberStyles.HexNumber);

        var t = percent < 0 ? 0 : 255;
        var p = percent < 0 ? percent*-1 : percent;

        int newR = Convert.ToInt32(Math.Round((t - rInt) * p) + rInt);
        var newG = Convert.ToInt32(Math.Round((t - gInt) * p) + gInt);
        var newB = Convert.ToInt32(Math.Round((t - bInt) * p) + bInt);

        return String.Format("#{0:X2}{1:X2}{2:X2}", newR, newG, newB);
    }

5
এর আগে কখনও সি # ব্যবহার করা হয়নি, তবে দেখে মনে হচ্ছে এটি শেষ তিনটি পরিবর্তনশীল ঘোষণাকে আরও জোরদার করেছে। একই ধরণের ডেটার জন্য একটি intএবং দুটি vars
পিম্প ট্রাইজকিট

4
সি # এর ভর কীওয়ার্ডটির অর্থ কম্পাইলারটি সংকলনের সময় প্রকারটি অনুমান করতে দেয়। সুতরাং উপরের উদাহরণে int এবং var একটি পরিবর্তনশীল একই ধরণের সংজ্ঞা দেয় - int। আপনার যদি দীর্ঘ টাইপের নাম থাকে বা আপনি কোনও বেনামি প্রকারটি উল্লেখ করতে চান তবে এটি কার্যকর। এটি অদ্ভুত কারণ ব্যবহারকারী 1618171 দুটি ভেরিয়েবল ঘোষণার স্টাইল মিশিয়েছে - সম্ভবত টাইপো।
ড্যানিয়েল জেমস ব্রায়ার্স

2

আমি একটি রঙ একটি নির্দিষ্ট উজ্জ্বলতার স্তরে পরিবর্তন করতে চেয়েছিলাম - রঙের আগে যত উজ্জ্বলতা থাকুক না কেন - এখানে একটি সাধারণ জেএস ফাংশন যা ভালভাবে কাজ করছে বলে মনে হচ্ছে, যদিও আমি নিশ্চিত যে এটি আরও কম হতে পারে sure

function setLightPercentage(col: any, p: number) {
    const R = parseInt(col.substring(1, 3), 16);
    const G = parseInt(col.substring(3, 5), 16);
    const B = parseInt(col.substring(5, 7), 16);
    const curr_total_dark = (255 * 3) - (R + G + B);

    // calculate how much of the current darkness comes from the different channels
    const RR = ((255 - R) / curr_total_dark);
    const GR = ((255 - G) / curr_total_dark);
    const BR = ((255 - B) / curr_total_dark);

    // calculate how much darkness there should be in the new color
    const new_total_dark = ((255 - 255 * (p / 100)) * 3);

    // make the new channels contain the same % of available dark as the old ones did
    const NR = 255 - Math.round(RR * new_total_dark);
    const NG = 255 - Math.round(GR * new_total_dark);
    const NB = 255 - Math.round(BR * new_total_dark);

    const RO = ((NR.toString(16).length === 1) ? "0" + NR.toString(16) : NR.toString(16));
    const GO = ((NG.toString(16).length === 1) ? "0" + NG.toString(16) : NG.toString(16));
    const BO = ((NB.toString(16).length === 1) ? "0" + NB.toString(16) : NB.toString(16));

    return "#" + RO + GO + BO;}

Coolio! আমি ধরে নিলাম যে pরেঞ্জ আছে 0-100? আরজিবিতে কীভাবে সঠিকভাবে উজ্জ্বলতা সংজ্ঞায়িত করতে হয় তা আমি জানি না, এইচএসএল জিনিসটি স্থির করে। উদাহরণস্বরূপ, এর #FF00FFচেয়ে উজ্জ্বল #FF0000? যদি তা হয় তবে তা বোঝাবে যে ম্যাজেন্টা লাল থেকে দ্বিগুণ উজ্জ্বল। অতএব, খাঁটি লাল পরীক্ষা ব্যবহৃত হয়। খাঁটি লাল রঙে পাস করুন #FF0000, 50% উজ্জ্বলতায় সেট করুন, এবং আমরা এখানে পেয়েছি #FF4040, এটা কি ঠিক? আমি লাল 50% উজ্জ্বলতা তৈরি করার অনুমান করবো, আমরা ইতিমধ্যে আরও উজ্জ্বল হয়ে দেখছি যে এর ইতিমধ্যে সম্পূর্ণ উজ্জ্বল .. যেমন #800000150 বা উজ্জ্বলতা হবে 150% #FF8080। গোলাপী কি উজ্জ্বল লাল? বা লাল ইতিমধ্যে সম্পূর্ণ উজ্জ্বল?
পিম্প ট্রাইজকিট

আপনি ঠিক বলেছেন - আমার উল্লেখ করা উচিত ছিল যে পি অবশ্যই 1-100 এর মধ্যে থাকতে হবে!
Torbjörn জোসেফসন

# FF00FF এর লাল চ্যানেলে 255 মান, সবুজ চ্যানেলে 0 এবং নীল চ্যানেলে 255 রয়েছে। চ্যানেলগুলিতে সম্মিলিত মানগুলি যত বেশি হয়, রঙের উজ্জ্বলতা তত বেশি। সংখ্যা পিতে বলা হয়েছে যে আমরা চাই নতুন রঙটি মূল রঙের চেয়ে 50% উজ্জ্বল হোক। আমি 100% নই যে # FF4040 "50% যতটা সম্ভব উজ্জ্বল লাল" এর সঠিক উত্তর। গাer় ছায়া গো উত্পাদন (এই ক্ষেত্রে, লাল চ্যানেলের নিম্ন মানের সহ) সংশোধন প্রয়োজন
Torbjörn জোসেফসন

হ্যাঁ, আমি আরজিবিতে উজ্জ্বলতার বিষয়ে কথা বলার ক্ষেত্রে অস্পষ্টতাটি দেখছিলাম। যদি এইচএসএলতে রূপান্তরিত হয় তবে Lচ্যানেলটি আক্ষরিক উজ্জ্বলতা। আমার [ব্যক্তিগত মানসিক] বিষয়টি এখানে আমার #FF0000কাছে সম্পূর্ণ উজ্জ্বল। এবং #FF4040হালকা তবে উজ্জ্বল নয় .... আমার কাছে হালকা মানে গোলাপির মতো সাদা রঙের কাছে। এবং উজ্জ্বলতা এটির কতটুকু পেয়েছে এবং এটি সম্পূর্ণ লাল, তাই লাল, সম্পূর্ণ উজ্জ্বল। অতএব, #FF0000উজ্জ্বল করা যায় না .. বরং .. হালকা ... সম্ভবত আমি কেবল একটি বেহায়া, লোল !! আমি সত্যিই রঙ তত্ত্ব জানি না, খুব, আমি সত্যিই আমার কথা বলছি ...
পিম্প ট্রাইস্কিট

তবে আমি জানি যে আমি যখন আমার মনিটরে উজ্জ্বলতা পরিবর্তন করি তখন রেডগুলি আমার কাছে গোলাপী হয় না ... আমি সম্ভবত এখানেই যুক্তি শুরু করেছি।
পিম্প ট্রিজকিট

1

নিম্নলিখিত পদ্ধতিটি আপনাকে একটি হেক্সাডেসিমাল (হেক্স) রঙের স্ট্রিংয়ের এক্সপোজার মানটি হালকা বা গাen় করার অনুমতি দেবে:

private static string GetHexFromRGB(byte r, byte g, byte b, double exposure)
{
    exposure = Math.Max(Math.Min(exposure, 1.0), -1.0);
    if (exposure >= 0)
    {
        return "#"
            + ((byte)(r + ((byte.MaxValue - r) * exposure))).ToString("X2")
            + ((byte)(g + ((byte.MaxValue - g) * exposure))).ToString("X2")
            + ((byte)(b + ((byte.MaxValue - b) * exposure))).ToString("X2");
    }
    else
    {
        return "#"
            + ((byte)(r + (r * exposure))).ToString("X2")
            + ((byte)(g + (g * exposure))).ToString("X2")
            + ((byte)(b + (b * exposure))).ToString("X2");
    }

}

GetHexFromRGB () এর সর্বশেষ পরামিতি মানের জন্য, -1 এবং 1 এর মধ্যে কোথাও একটি দ্বিগুণ মান দিন (-1 কালো, 0 অপরিবর্তিত, 1 সাদা):

// split color (#e04006) into three strings
var r = Convert.ToByte("e0", 16);
var g = Convert.ToByte("40", 16);
var b = Convert.ToByte("06", 16);

GetHexFromRGB(r, g, b, 0.25);  // Lighten by 25%;

0

পিএইচপি-তে কীভাবে ছায়ার রঙ সহজ করবেন?

<?php
function shadeColor ($color='#cccccc', $percent=-25) {

  $color = Str_Replace("#",Null,$color);

  $r = Hexdec(Substr($color,0,2));
  $g = Hexdec(Substr($color,2,2));
  $b = Hexdec(Substr($color,4,2));

  $r = (Int)($r*(100+$percent)/100);
  $g = (Int)($g*(100+$percent)/100);
  $b = (Int)($b*(100+$percent)/100);

  $r = Trim(Dechex(($r<255)?$r:255));  
  $g = Trim(Dechex(($g<255)?$g:255));  
  $b = Trim(Dechex(($b<255)?$b:255));

  $r = ((Strlen($r)==1)?"0{$r}":$r);
  $g = ((Strlen($g)==1)?"0{$g}":$g);
  $b = ((Strlen($b)==1)?"0{$b}":$b);

  return (String)("#{$r}{$g}{$b}");
}

echo shadeColor(); // #999999

এটি পাবলো এর উত্তরের পিএইচপি সংস্করণ। দুর্ভাগ্যক্রমে, এটি চূড়ান্ত সমাধানের চেয়ে দীর্ঘ এবং ধীর এবং এটি সঠিকভাবে রঙ হালকা করে না। এটি তাদের সঠিকভাবে অন্ধকার করে দেয়। খাঁটি লাল (# FF0000) দিয়ে পরীক্ষা করুন, 25% হালকা হওয়া উচিত (# FF4040)। কেভিন এম এর চূড়ান্ত সমাধান ভি 2 এর পিএইচপি সংস্করণটির জন্য আমার উত্তরটির শেষে দেখুন।
পিম্প ট্রাইজকিট

0

আমি এর জিক্যুরি নির্ভরতা অপসারণ করতে চমৎকার এক্সক্লোর লাইব্রেরির একটি বন্দর তৈরি করেছি। লাইটনিং এবং গা dark় রঙ সহ সেখানে এক টন ফাংশন রয়েছে।

সত্যই, হেক্সকে আরজিবিতে রূপান্তর করা হালকা বা গা dark় রঙ থেকে সম্পূর্ণ পৃথক ফাংশন। দয়া করে জিনিসগুলি শুকনো রাখুন। যাই হোক না কেন, একবার আপনার আরজিবি রঙ হয়ে গেলে আপনি কেবল নিজের হালকা স্তর এবং প্রতিটি আরজিবি মানের সাথে আপনার যে হালকা স্তর রাখতে চান তার মধ্যে পার্থক্য যুক্ত করতে পারেন:

var lightness = function(level) {
    if(level === undefined) {
        return Math.max(this.g,this.r,this.b)
    } else {
        var roundedLevel = Math.round(level) // fractions won't work here
        var levelChange = roundedLevel - this.lightness()

        var r = Math.max(0,this.r+levelChange)
        var g = Math.max(0,this.g+levelChange)
        var b = Math.max(0,this.b+levelChange)

        if(r > 0xff) r = 0xff
        if(g > 0xff) g = 0xff
        if(b > 0xff) b = 0xff

        return xolor({r: r, g: g, b: b})
    }
}

var lighter = function(amount) {
    return this.lightness(this.lightness()+amount)
}

উত্সটির আরও জানতে https://github.com/fresheneesz/xolor দেখুন ।


কোডটি আমার ওপি (গতি / আকার / নির্ভুলতা) এর সাথে সম্পর্কিত বলে আমি এখনও বিশ্লেষণ করিনি। তবে প্রথমে পড়তে কিছু মন্তব্য করা উচিত: 1) আমি সম্মত হই যে হেক্সকে আরজিবিতে রূপান্তর করা সম্পূর্ণ পৃথক ফাংশন হিসাবে দেখা যেতে পারে .. যদি আমার সমস্যাটি একটি শুকনো ফাংশন দিয়ে সমাধানের উদ্দেশ্যে করা হয়েছিল, যা কোনও প্রয়োজন ছিল না। এখানে উদ্দেশ্যটি ছিল একটি উত্তর (আমার সংস্করণ 2 দেখুন) যা সুপার দ্রুত এবং সুপার ক্ষুদ্র (2 লাইন!) ছিল এবং হেক্স রঙটি হালকা এবং অন্ধকার করে এমন একটি ... বিশেষত ... একা একা স্বতঃস্ফূর্ত হিসাবে ফাংশন। যাতে, এর চূড়ান্ত ব্যবহারে এটি একটি সাধারণ একক ফাংশন কল হবে cont
<<<

2) এবং সংস্করণ 3 এর ক্ষেত্রে জনপ্রিয় দাবি অনুসারে, সম্পূর্ণরূপে স্বতঃস্ফূর্ত স্বাবলম্বিত সার্বজনীন ফাংশন করার তাগিদ, যত তাড়াতাড়ি সম্ভব এবং যতটা ছোট, এটি অন্ধভাবে একটি হেক্স বা আরজিবি রঙ নিতে পারে এবং তাদের সমস্ত ক্ষেত্রে বৈচিত্র। সুতরাং, আরজিবিতে হেক্সের রূপান্তর প্রয়োজন needed <
অবিরত

3) কোড সহজ বিশ্লেষণ উপর। এটি প্রদর্শিত হয় যে এটি অনেক ধীরে চলবে এবং এটি সম্ভবত আমার সংস্করণ 2 এর চেয়ে অনেক বড় (এটি আমার ওপির আসল উত্তর; সংস্করণ 3 জনসাধারণের জন্য ছিল)। ন্যায়সঙ্গত হওয়ার জন্য, আমার এই কোডটি আমার আরজিবি সংস্করণ 2 এর সাথে তুলনা করা উচিত যা কোনও রূপান্তর করে না এবং শুষ্কতা সম্পর্কে আপনার পয়েন্টটির উত্তর বলে মনে হচ্ছে। এবং সত্য কথা বললে, আপনার বন্দরটি হেক্সের জন্য আমার 2 লাইনারের চেয়ে বোঝার মতো সহজ কিছু নয়। সুতরাং, এটির শুকানোর সময়, এটি আসলে এতটা নয়, যদি কোনও হয় তবে সহজ। (শুষ্কতা বোঝার-দক্ষতার জন্য খুব একটা সহায়তা করে নি)
<<<

4) আমার আরজিবি সংস্করণ 2 আপনি চাইলে কোনও রূপান্তর 2 লাইন ফাংশন নয় want আমার আসল ওপির জন্য আমার বিশেষ সমাধানটি হেক্সস চেয়েছিল। এ কারণেই সংস্করণ ২ এর দুটি পৃথক প্রকার রয়েছে তবে আপনি শুষ্কতা এবং হেক্স রূপান্তর সম্পর্কে বিন্দুটি উল্লেখ করেছেন সুতরাং আমরা এখন 3 সংস্করণে সত্যই মনোনিবেশ করছি Version সংস্করণ 3 অনেক পরে এসেছিল; সংস্করণ 2 জনপ্রিয় হওয়ার পরেই। <
অবিরত

৫) যদিও আমি একমত হব যে শুষ্কতা সাধারণত সর্বজনীনতার জন্য সহায়তা করে। এবং বেশিরভাগ ক্ষেত্রে, বোঝার-যোগ্যতার জন্য। দুর্ভাগ্যক্রমে এটি এই উদাহরণে ব্যয়। এই ব্যয়গুলি হ'ল এর বৃহত্তর এবং আপাতদৃষ্টিতে অনেক ধীর এবং আপাতদৃষ্টিতে স্ট্যাকের (তার পুনরাবৃত্ত-জাতীয় প্রকৃতির সাথে) এবং বিশ্বব্যাপী (2 ফাংশন; ভি 2 এর তুলনায়) উভয়ই বেশি স্মৃতি ব্যবহার করে।
পিম্প ট্রাইস্কিট

0

আমি দীর্ঘদিন ধরে রঙের ছিদ্র / ছায়াছবি তৈরি করতে সক্ষম হতে চেয়েছিলাম, এটি আমার জাভাস্ক্রিপ্ট সমাধান:

const varyHue = function (hueIn, pcIn) {
    const truncate = function (valIn) {
        if (valIn > 255) {
            valIn = 255;
        } else if (valIn < 0)  {
            valIn = 0;
        }
        return valIn;
    };

    let red   = parseInt(hueIn.substring(0, 2), 16);
    let green = parseInt(hueIn.substring(2, 4), 16);
    let blue  = parseInt(hueIn.substring(4, 6), 16);
    let pc    = parseInt(pcIn, 10);    //shade positive, tint negative
    let max   = 0;
    let dif   = 0;

    max = red;

    if (pc < 0) {    //tint: make lighter
        if (green < max) {
            max = green;
        }

        if (blue < max) {
            max = blue;
        }

        dif = parseInt(((Math.abs(pc) / 100) * (255 - max)), 10);

        return leftPad(((truncate(red + dif)).toString(16)), '0', 2)  + leftPad(((truncate(green + dif)).toString(16)), '0', 2) + leftPad(((truncate(blue + dif)).toString(16)), '0', 2);
    } else {    //shade: make darker
        if (green > max) {
            max = green;
        }

        if (blue > max) {
            max = blue;
        }

        dif = parseInt(((pc / 100) * max), 10);

        return leftPad(((truncate(red - dif)).toString(16)), '0', 2)  + leftPad(((truncate(green - dif)).toString(16)), '0', 2) + leftPad(((truncate(blue - dif)).toString(16)), '0', 2);
    }
};

কিছু ব্যবহারের উদাহরণ সাহায্য করবে। এবং অন্যান্য সংস্করণে কেন এই সংস্করণ সম্পর্কে কিছু ব্যাখ্যা হতে পারে। এই সংস্করণটি যথেষ্ট ধীর হয়ে চলেছে বলে মনে হচ্ছে। এবং এটি অনেক দীর্ঘ। এবং এটি সঠিকভাবে শেড বলে মনে হচ্ছে না। দেখে মনে হচ্ছে আপনার এলইআরপি, বা সিমিলার কিছু ব্যবহার করছে ich যা ভাল। দুর্ভাগ্যক্রমে, এটি কেবল একটি চ্যানেল থেকে, তারপরে একই মানটি সমস্ত চ্যানেল জুড়ে ব্যবহৃত হয়। এটি ঠিক নয়, উচ্চতর নির্ভুলতা পাওয়ার জন্য আপনার প্রতিটি চ্যানেল পৃথকভাবে LERP করা উচিত। এই প্রশ্নের আমার উত্তর হিসাবে। প্লাস এটির ছোট এবং দ্রুত এবং ত্রুটিগুলি পরীক্ষা করে এবং
আরজিবি

একটি ব্যবহারের উদাহরণ: ভিন্নতা ("6e124c", 77) যেখানে প্রথম যুক্তি হেক্সের রঙ এবং দ্বিতীয় শতাংশ শতাংশ পরিবর্তন the ইতিবাচক শতাংশ পরিবর্তনের ছায়াগুলি (গাens় হয়) যখন ফলকে নেতিবাচক মান টিপস (হালকা করে) করে। আমি এই পৃষ্ঠায় আসার কয়েক ঘন্টা আগে আমার প্রথম প্রয়াস হিসাবে রুটিনটি লিখেছিলাম এবং এটি কেবল আগ্রহের বিষয় হিসাবে পোস্ট করেছি। আমি সচেতন ছিলাম না যে আমাকে আপনার প্রচেষ্টা আরও ভাল করতে হবে বা এটি করার আগে আমার আপনার অনুমোদনের দরকার ছিল। এটি অন্য কারও কাছে উল্লেখ ছাড়াই সম্পূর্ণ নিজের কাজ। আমি এলইআরপি শুনিনি, আমি এটি যাচাই করে দেখব, পরামর্শের জন্য ধন্যবাদ।
ব্যবহারকারী2655360

হেই, আচ্ছা, অবশ্যই আপনাকে কিছু করতে হবে না! এবং আমরা সবাই আপনার প্রচেষ্টার জন্য আপনাকে ধন্যবাদ! আমার প্রথম প্রধান উদ্বেগগুলি প্রথমে তালিকাভুক্ত ছিল। আপনার উত্তরটি আপনাকে সহায়তা করার চেষ্টা করছে যাতে এটি ভোট পেতে পারে। (ব্যবহারগুলি এবং এটি কীভাবে কাজ করে তার ব্যাখ্যা ইত্যাদি) অন্য জিনিসগুলি অবশ্যই প্রত্যেকের জ্ঞানকে আরও সহায়তা করার জন্য একটি দ্রুত বিশ্লেষণ । দুঃখিত, যদি এটি কিছুটা আক্রমণাত্মক মনে হয়। তবে অন্য একটি পরামর্শ #হেক্স রঙের গ্রহণযোগ্যতা তৈরি করা । দুঃখিত বলে মনে হচ্ছে .. "অনুমোদন" ... আমি এটিকে পিয়ার পর্যালোচনা হিসাবে দেখেছি। আপনি যদি কেউ চান না যে আপনার কোড বিশ্লেষণ করুন, বা প্রতিক্রিয়া জানান, আমি ক্ষমা চাই।
পিম্প ট্রাইজকিট

0

আপনার দৃষ্টিভঙ্গি ঠিক আছে :) আমি আপনার সংক্ষিপ্ততম সংস্করণটি কিছুটা সহজ করি (স্যাচুরেশন নিয়ন্ত্রণের জন্য এখানে দেখুন )

(col,amt)=> (+('0x'+col)+amt*0x010101).toString(16).padStart(6,0)

এবং সংস্করণ # এবং রঙের ব্যাপ্তি পরীক্ষা করে


0

আমিও একটি সাধারণ প্যাকেজ তৈরি করেছি। আমি আইআর ^ 3 এর জঞ্জালতা ব্যবহার করেছি অবশ্যই, আরজিবি মানগুলি IN ^ 3 এ রয়েছে যা উত্তল নয় তাই এটি সত্যই নিখুঁত নয়

গাen় করতে আমি নিম্নলিখিতগুলি ব্যবহার করেছি

for (let i = 0; i < rgb.length; i++) {
   rgb[i] = Math.floor(rgb[i] - ratio * rgb[i]);
}

এবং হালকা করা

for (let i = 0; i < rgb.length; i++) {
   rgb[i] = Math.ceil(rgb[i] + ratio * (255 - rgb[i]));
}

এই প্যাকেজটি https://github.com/MarchWorks/colortone

ডেমো https://colortone.now.sh/

যেভাবে আমি জিনিসগুলি করছি যদি আপনি -1 এর অনুপাতটি পাস করেন তবে আপনি কালো, হোয়াইট দিয়ে শেষ করবেন যদি অনুপাত 1 হয় তবে অনুপাত হিসাবে 0 পাস করলে রঙ পরিবর্তন হবে না


0

আমার এটি সি # তে দরকার ছিল, এটি নেট বিকাশকারীদের সহায়তা করতে পারে

public static string LightenDarkenColor(string color, int amount)
    {
        int colorHex = int.Parse(color, System.Globalization.NumberStyles.HexNumber);
        string output = (((colorHex & 0x0000FF) + amount) | ((((colorHex >> 0x8) & 0x00FF) + amount) << 0x8) | (((colorHex >> 0xF) + amount) << 0xF)).ToString("x6");
        return output;
    }

আপনি "নন ওয়ার্কিং" ফাংশনটি রূপান্তর করেছেন যা নেতৃস্থানীয় শূন্যগুলি নিয়ে কাজ করে না এবং অঙ্কগুলিতে এফএফের উপরে যেতে পারে, = উপরের রঙের উপাদানটি সংশোধন করতে পারে ...
বি

আমি যখন ফাংশনটি চেষ্টা করেছি তখন এটি অ হেক্স মান (16 = 0xF) এবং (8 = 0x8) এর কারণে কাজ করে না এবং 8 পজিশনে একটি রঙ দেয় তবে এখন এটি খুব ভালভাবে কাজ করে
নাসিম

আপনি এফএফ থেকে বৃদ্ধি চেষ্টা করেছেন? (0xFFFFFF + 0x000004 থেকে বলুন): আপনার কোডটি না বাড়ানোর পরিবর্তে সেই সর্বোচ্চ মানটির (0x1000003 বলুন) রোল করবে এবং বিশেষত 2 টি ওপরের রঙের উপাদানগুলি 00 এ সেট করুন যা তারা করতে পারে বৃহত্তম পরিবর্তন ...
বি

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