แปลง Hex เป็น RGBA


86

ซอของฉัน - http://jsbin.com/pitu/1/edit

ฉันต้องการลองแปลง hex เป็น rgba อย่างง่าย ฉันเคยใช้เบราว์เซอร์ที่ใช้แสดงสีโดยใช้ rgb เป็นค่าเริ่มต้นดังนั้นเมื่อใช้ตัวเลือกสี farbtastic ฉันจะแปลงค่าฐานสิบหกเป็น rgb โดยการจับสีพื้นหลังค่าฐานสิบหกที่สร้างขึ้น (เป็น rgb โดยค่าเริ่มต้น = การแปลงอย่างง่าย)

ฉันพยายามเปลี่ยน)สัญลักษณ์เป็น, 1)แต่ไม่ได้ผลดังนั้นฉันจึงไปดูว่าการแปลง rgb เป็น rgba จะทำงานอย่างไรและฉันยังคงประสบปัญหาอยู่

jquery

$('.torgb').val($('#color').css('background-color'));
$('.torgba').val().replace(/rgb/g,"rgba");

เป้าหมาย
ป้อนคำอธิบายภาพที่นี่

แก้ไข :

TinyColorเป็นไลบรารี js การจัดการสีที่ยอดเยี่ยมที่ทำทุกอย่างที่ฉันต้องการที่นี่และอื่น ๆ ฉันคิดว่าพวกคุณอาจต้องการลองดู! - https://github.com/bgrins/TinyColor


1
TinyColorเป็นไลบรารี js การจัดการสีที่ยอดเยี่ยมที่ทำทุกอย่างที่ฉันต้องการที่นี่และอื่น ๆ ฉันคิดว่าพวกคุณอาจต้องการลองดู!
Michael Schwartz

คำตอบ:


160
//If you write your own code, remember hex color shortcuts (eg., #fff, #000)

function hexToRgbA(hex){
    var c;
    if(/^#([A-Fa-f0-9]{3}){1,2}$/.test(hex)){
        c= hex.substring(1).split('');
        if(c.length== 3){
            c= [c[0], c[0], c[1], c[1], c[2], c[2]];
        }
        c= '0x'+c.join('');
        return 'rgba('+[(c>>16)&255, (c>>8)&255, c&255].join(',')+',1)';
    }
    throw new Error('Bad Hex');
}

hexToRgbA('#fbafff')

/*  returned value: (String)
rgba(251,175,255,1)
*/

1
Thank you .. Worked like ปาฏิหาริย์ .. :)
Manprit Singh Sahota

4
วิธีแก้ปัญหาที่เข้าใจง่ายมาก แต่ไม่รองรับ 8 form hex เช่น#ff0000aa?
supersan

1
จะใช้ไม่ได้ถ้าอินพุตไม่ตรง 3 หรือ 6 อักขระ
Kehlan Krumme

97

@ ElDoRado1239 มีแนวคิดที่ถูกต้อง แต่ยังมีวิธีที่สะอาดกว่า:

function hexToRGB(hex, alpha) {
    var r = parseInt(hex.slice(1, 3), 16),
        g = parseInt(hex.slice(3, 5), 16),
        b = parseInt(hex.slice(5, 7), 16);

    if (alpha) {
        return "rgba(" + r + ", " + g + ", " + b + ", " + alpha + ")";
    } else {
        return "rgb(" + r + ", " + g + ", " + b + ")";
    }
}

hexToRGB('#FF0000', 0.5);


1
หมายเหตุ: นี้จะล้มเหลวในทางลัด HEX #fffเช่น ที่น่าจะแก้ไขได้ง่ายๆ!
Matthew Herbst

1
ใช่คุณต้องให้ฟังก์ชันป้อนข้อมูลที่ถูกต้อง ...
AJFarkas

อ่านได้มากฉันชอบมันมากกว่าโซลูชันที่ใช้ reg exp
dahrens

ทำได้ดีมาก !! สิ่งเล็กน้อยที่ฉันต้องพูดถึง ฉันมีประสบการณ์ที่ไม่ดีในการเว้นช่องว่างระหว่างค่าคอมมาและค่า RGBA ในสตริง (เช่น: rgba (255, 35, 234, 0.5)) โดยเฉพาะอย่างยิ่งถ้าคุณส่งค่านี้ไปยังโปรแกรมอื่นโปรดทราบว่า เนื่องจากมีบางโปรแกรมที่ไม่ยอมรับช่องว่างระหว่างค่าในสตริง ดังนั้นควรลบช่องว่างเหล่านั้นออกจากผลลัพธ์สุดท้ายดีกว่า
Tharanga

eslintเป็นเพียงการบังคับใช้รูปแบบ มันเป็นเพียงความบังเอิญเท่านั้นที่ไม่มีสิ่งใดที่ฉันเขียนขัดแย้งกับความชอบสไตล์ของคุณ ในความเป็นจริงสิ่งนี้จะไม่ส่งผลเสียต่อโครงการที่ฉันกำลังดำเนินการอยู่เช่น
AJFarkas

34

ฟังก์ชัน ES6 สำหรับจัดการเฉพาะฐานสิบหกอักขระที่มีหรือไม่มี '#':

const hex2rgba = (hex, alpha = 1) => {
  const [r, g, b] = hex.match(/\w\w/g).map(x => parseInt(x, 16));
  return `rgba(${r},${g},${b},${alpha})`;
};

การใช้งาน:

hex2rgba('#af087b', .5)   // returns: rgba(175,8,123,0.5)
hex2rgba('af087b', .5)    // returns: rgba(175,8,123,0.5)
hex2rgba('af087b')        // returns: rgba(175,8,123,1)

ตั้งแต่toStringบนArrayร่วมกับ,และใส่ความเป็นจริงที่สามารถrrggbbaa hexให้คุณสามารถเปลี่ยน const RGB = hex.match ( ... ). ชิ้น (0,3) .map ( ... ) returnn` $ {RGB} $ {อัลฟา } `;
Morteza Tourani

1
โค้ดด้านล่างจะแปลง hex2rgba ด้วย ('# 369', 0.5); var hex2rgba = (hex, alpha = 1) => {const [r, g, b] = hex.match (hex.length <= 4? / \ w / g: / \ w \ w / g) .map ( x => parseInt (x.length <2?: ${x}${x}x, 16)); กลับrgba(${r},${g},${b},${alpha}); };
Serkan KONAKCI

17

เวอร์ชัน Clean TypeScript:

hexToRGB(hex: string, alpha: string) {

  const r = parseInt(hex.slice(1, 3), 16);
  const g = parseInt(hex.slice(3, 5), 16);
  const b = parseInt(hex.slice(5, 7), 16);

  if (alpha) {
    return `rgba(${r}, ${g}, ${b}, ${alpha})`;
  } else {
    return `rgb(${r}, ${g}, ${b})`;
  }
}

ขึ้นอยู่กับคำตอบของ @ AJFarkas


1
สิ่งนี้ใช้ไม่ได้ทุกครั้งในบางกรณีจะส่งคืน NaN สำหรับ r, g หรือ / และ b
เกิดใหม่

ทำงานให้ฉัน! Thx
นักเป่าแซ็กโซโฟน

คนอื่นไม่ควรกลับมาrgb(${r}, ${g}, ${b})เพราะมันไม่มีอัลฟ่า?
Amanshu Kataria

@AmanshuKataria ใช่มันควรจะเป็น จุดที่ดี
Chrillewoodz

10

Hex Form Modular Approach ใด ๆ

ความท้าทายหลักคือในปี 2018 มี HEX อยู่ไม่กี่รูปแบบ รูปแบบดั้งเดิม 6 ถ่านรูปแบบสั้น 3 ตัวและรูปแบบถ่าน 4 และ 8 ใหม่ที่มีอัลฟา ฟังก์ชันต่อไปนี้สามารถจัดการกับรูปแบบ HEX ใดก็ได้

const isValidHex = (hex) => /^#([A-Fa-f0-9]{3,4}){1,2}$/.test(hex)

const getChunksFromString = (st, chunkSize) => st.match(new RegExp(`.{${chunkSize}}`, "g"))

const convertHexUnitTo256 = (hexStr) => parseInt(hexStr.repeat(2 / hexStr.length), 16)

const getAlphafloat = (a, alpha) => {
    if (typeof a !== "undefined") {return a / 255}
    if ((typeof alpha != "number") || alpha <0 || alpha >1){
      return 1
    }
    return alpha
}

export const hexToRGBA = (hex, alpha) => {
    if (!isValidHex(hex)) {throw new Error("Invalid HEX")}
    const chunkSize = Math.floor((hex.length - 1) / 3)
    const hexArr = getChunksFromString(hex.slice(1), chunkSize)
    const [r, g, b, a] = hexArr.map(convertHexUnitTo256)
    return `rgba(${r}, ${g}, ${b}, ${getAlphafloat(a, alpha)})`
}

อัลฟ่าสามารถจัดเตรียมให้กับฟังก์ชันได้ด้วยวิธีต่อไปนี้:

  1. เป็นส่วนหนึ่งของ 4 หรือ 8 แบบฟอร์ม HEX
  2. เป็นพารามิเตอร์ที่สองระหว่าง 0-1

เอาท์พุท

    const c1 = "#f80"
    const c2 = "#f808"
    const c3 = "#0088ff"
    const c4 = "#0088ff88"
    const c5 = "#98736"

    console.log(hexToRGBA(c1))   //  rgba(255, 136, 0, 1)
    console.log(hexToRGBA(c2))   //  rgba(255, 136, 0, 0.53125)
    console.log(hexToRGBA(c3))   //  rgba(0, 136, 255, 1)
    console.log(hexToRGBA(c4))   //  rgba(0, 136, 255, 0.53125)
    console.log(hexToRGBA(c5))   //  Uncaught Error: Invalid HEX

    console.log(hexToRGBA(c1, 0.5))   //  rgba(255, 136, 0, 0.5)
    console.log(hexToRGBA(c3, 0.5))   //  rgba(0, 136, 255, 0.5)

1
เบราว์เซอร์บางตัวรองรับสี Hex ที่มีความทึบและอื่น ๆ ไม่รองรับ คำตอบนี้มีประโยชน์มากในการแปลง 8 form hex เป็น rgba, rgba ได้รับการสนับสนุนในทุกเบราว์เซอร์
George

1
@ จอร์จขอบคุณ! หลังจากสร้างสิ่งนี้ฉันถามตัวเองว่าแนวทางที่ครอบคลุมนั้นจำเป็นจริงหรือไม่ ความคิดเห็นของคุณมีค่า
Ben Carp

1
ฉันคิดว่าอาจมีข้อผิดพลาดเล็ก ๆ 1 ข้อในเครื่องคำนวณอัลฟา ฉันคิดว่ามันควรอ่าน: ส่งคืน a / 255 มิฉะนั้น FF จะไม่กลับ 1
Dustin Kerstein

@DustinKerstein จับดี! อาจไม่สามารถทำอันตรายได้ แต่ก็ควรได้รับการแก้ไข
Ben Carp

1
นี่เป็นคำตอบที่ดีที่สุดและใช้ได้ผลกับการทดสอบทุกหน่วย
Menai Ala Eddine - Aladdin

8

นี่คือฟังก์ชันที่ส่งคืน rgb หรือ rgba หากคุณระบุอัลฟ่า ฟังก์ชันนี้ยังแปลงรหัสสีฐานสิบหกแบบสั้นด้วย

ฟังก์ชัน:

function hexToRgb(hex, alpha) {
   hex   = hex.replace('#', '');
   var r = parseInt(hex.length == 3 ? hex.slice(0, 1).repeat(2) : hex.slice(0, 2), 16);
   var g = parseInt(hex.length == 3 ? hex.slice(1, 2).repeat(2) : hex.slice(2, 4), 16);
   var b = parseInt(hex.length == 3 ? hex.slice(2, 3).repeat(2) : hex.slice(4, 6), 16);
   if ( alpha ) {
      return 'rgba(' + r + ', ' + g + ', ' + b + ', ' + alpha + ')';
   }
   else {
      return 'rgb(' + r + ', ' + g + ', ' + b + ')';
   }
}

ตัวอย่าง:

hexToRgb('FF0000');// rgb(255, 0, 0)
hexToRgb('#FF0000');// rgb(255, 0, 0)
hexToRgb('#FF0000', 1);// rgba(255, 0, 0, 1)
hexToRgb('F00');// rgb(255, 0, 0)
hexToRgb('#F00');// rgb(255, 0, 0)
hexToRgb('#F00', 1);// rgba(255, 0, 0, 1)

6

ES6ทันสมัยไม่มี RegEx โซลูชันพร้อมการตรวจสอบข้อผิดพลาดและฟังก์ชันลูกศรคงที่ซึ่งจะคืนค่า null สำหรับข้อผิดพลาด หากไม่ได้กำหนดอัลฟาจะใช้ค่าเริ่มต้นของค่าหนึ่ง:

const hexToRGB = (hex, alpha = 1) => {
    let parseString = hex;
    if (hex.startsWith('#')) {parseString = hex.slice(1, 7);}
    if (parseString.length !== 6) {return null;}
    const r = parseInt(parseString.slice(0, 2), 16);
    const g = parseInt(parseString.slice(2, 4), 16);
    const b = parseInt(parseString.slice(4, 6), 16);
    if (isNaN(r) || isNaN(g) || isNaN(b)) {return null;}
    return `rgba(${r}, ${g}, ${b}, ${alpha})`;
};

หมายเหตุ: ส่งคืนnullข้อผิดพลาด คุณสามารถแทนที่{return null;}ด้วยคำสั่ง throw: {throw "Not a valid hex color!";}แต่คุณควรเรียกมันจากภายใน try-catch:

hexToRGB("#3454r5") => null
hexToRGB("#345465") => rgba(52, 84, 101, 1)
hexToRGB("#345465", 0.5) => rgba(52, 84, 101, 0.5)

5

โซลูชัน Pure JS หากช่วยได้:

function hexToRGB(hex,alphaYes){
 var h = "0123456789ABCDEF";
 var r = h.indexOf(hex[1])*16+h.indexOf(hex[2]);
 var g = h.indexOf(hex[3])*16+h.indexOf(hex[4]);
 var b = h.indexOf(hex[5])*16+h.indexOf(hex[6]);
 if(alphaYes) return "rgba("+r+", "+g+", "+b+", 1)";
 else return "rgb("+r+", "+g+", "+b+")";
}

"alpha ใช่" เป็น "จริง" หรือ "เท็จ" ขึ้นอยู่กับว่าคุณต้องการอัลฟ่าหรือไม่

ดูตัวอย่าง


elseคำหลักที่ไม่จำเป็นในกรณีนี้ มันจะส่งคืน non-alpha โดยไม่คำนึงถึง
Andy

โอ้ใช่ แต่ดูเหมือนว่า "เป็นระเบียบ" สำหรับฉันมากกว่า ฉันเดาว่าเป็นเรื่องของความชอบส่วนตัว
ElDoRado1239

รหัสนี้ใช้ไม่ได้กับฐานสิบหกตัวพิมพ์เล็ก (เช่น#f0a16e) ฉันขอแนะนำให้แปลงhexด้วยtoUpperCaseครั้งแรก
philippe_b

3

ฉันชอบคำตอบของ @AJFarkas และเพิ่มการสนับสนุนทางลัด hex (#fff) เข้ากับมัน

function hexToRGB(hex, alpha) {
    if (!hex || [4, 7].indexOf(hex.length) === -1) {
        return; // throw new Error('Bad Hex');
    }

    hex = hex.substr(1);
    // if shortcuts (#F00) -> set to normal (#FF0000)
    if (hex.length === 3) { 
        hex = hex.split('').map(function(el){ 
              return el + el + '';
            }).join('');
    }

    var r = parseInt(hex.slice(0, 2), 16),
        g = parseInt(hex.slice(2, 4), 16),
        b = parseInt(hex.slice(4, 6), 16);

    if (alpha !== undefined) {
        return "rgba(" + r + ", " + g + ", " + b + ", " + alpha + ")";
    } else {
        return "rgb(" + r + ", " + g + ", " + b + ")";
    }
}

document.write(hexToRGB('#FF0000', 0.5));
document.write('<br>');
document.write(hexToRGB('#F00', 0.4));


3

นี่คือเวอร์ชัน ES2015 + ที่มีการป้องกันมากกว่าเล็กน้อยและจัดการกับไวยากรณ์ 3 หลักชวเลข

/*
 * Takes a 3 or 6-digit hex color code, and an optional 0-255 numeric alpha value
 */
function hexToRGB(hex, alpha) {
  if (typeof hex !== 'string' || hex[0] !== '#') return null; // or return 'transparent'

  const stringValues = (hex.length === 4)
        ? [hex.slice(1, 2), hex.slice(2, 3), hex.slice(3, 4)].map(n => `${n}${n}`)
        : [hex.slice(1, 3), hex.slice(3, 5), hex.slice(5, 7)];
  const intValues = stringValues.map(n => parseInt(n, 16));

  return (typeof alpha === 'number')
    ? `rgba(${intValues.join(', ')}, ${alpha})`
    : `rgb(${intValues.join(', ')})`;
}

1

และอีกอันหนึ่งขึ้นอยู่กับการขยับเล็กน้อย

// hex can be a string in the format of "fc9a04", "0xfc9a04" or "#fc90a4" (uppercase digits are allowed) or the equivalent number
// alpha should be 0-1
const hex2rgb = (hex, alpha) => {
  const c = typeof(hex) === 'string' ? parseInt(hex.replace('#', ''), 16)  : hex;
  return `rgb(${c >> 16}, ${(c & 0xff00) >> 8}, ${c & 0xff}, ${alpha})`;
};

1

ลอง

// hex - str e.g. "#abcdef"; a - alpha range 0-1; result e.g. "rgba(1,1,1,0)"
let hex2rgba= (hex,a)=> `rgb(${hex.substr(1).match(/../g).map(x=>+`0x${x}`)},${a})`


1

นี่คือฟังก์ชันด่วนที่รองรับรหัสสี 3, 4, 6 และ 8 อักขระ:

function hexToRGBA(hex) {
    // remove invalid characters
    hex = hex.replace(/[^0-9a-fA-F]/g, '');

    if (hex.length < 5) { 
        // 3, 4 characters double-up
        hex = hex.split('').map(s => s + s).join('');
    }

    // parse pairs of two
    let rgba = hex.match(/.{1,2}/g).map(s => parseInt(s, 16));

    // alpha code between 0 & 1 / default 1
    rgba[3] = rgba.length > 3 ? parseFloat(rgba[3] / 255).toFixed(2): 1;

    return 'rgba(' + rgba.join(', ') + ')';
}

นี่คือสิ่งที่ทำ จะลบอักขระที่ไม่ใช่เลขฐานสิบหก หาก HEX สั้นกว่า 5 (3 หรือ 4) อักขระตัวอักษรจะเพิ่มเป็นสองเท่า จากนั้นแบ่ง HEX ออกเป็นคู่ของอักขระสองตัวและแยกวิเคราะห์แต่ละคู่เป็นจำนวนเต็ม หากมีอัลฟา HEX ระบบจะแยกวิเคราะห์เป็นทศนิยมจาก 0 ถึง 1 มิฉะนั้นจะมีค่าเริ่มต้นเป็น 1 สตริง RGBA จะถูกสร้างขึ้นโดยการรวมอาร์เรย์และส่งกลับ


0

แปลง HEX ด้วย alpha (ahex) เป็น rgba

function ahex_to_rba(ahex) {
    //clean #
    ahex = ahex.substring(1, ahex.length);
    ahex = ahex.split('');

    var r = ahex[0] + ahex[0],
        g = ahex[1] + ahex[1],
        b = ahex[2] + ahex[2],
        a = ahex[3] + ahex[3];

    if (ahex.length >= 6) {
        r = ahex[0] + ahex[1];
        g = ahex[2] + ahex[3];
        b = ahex[4] + ahex[5];
        a = ahex[6] + (ahex[7] ? ahex[7] : ahex[6]);
    }

    var int_r = parseInt(r, 16),
        int_g = parseInt(g, 16),
        int_b = parseInt(b, 16),
        int_a = parseInt(a, 16);


    int_a = int_a / 255;

    if (int_a < 1 && int_a > 0) int_a = int_a.toFixed(2);

    if (int_a || int_a === 0)
        return 'rgba('+int_r+', '+int_g+', '+int_b+', '+int_a+')';
    return 'rgb('+int_r+', '+int_g+', '+int_b+')';
}

ลองด้วยตัวเองด้วยตัวอย่าง:

ผู้เขียนต้นฉบับ


0

เพิ่มไปที่ @ ElDoRado1239

สำหรับผู้ที่ต้องการส่งผ่านค่าอัลฟา (typescript snippet):

static hexToRGB(hex: string, alpha: number): string {
    var h = "0123456789ABCDEF";
    var r = h.indexOf(hex[1]) * 16 + h.indexOf(hex[2]);
    var g = h.indexOf(hex[3]) * 16 + h.indexOf(hex[4]);
    var b = h.indexOf(hex[5]) * 16 + h.indexOf(hex[6]);
    if (alpha) {
      return `rgba(${r}, ${g}, ${b}, ${alpha})`
    }

    return `rgba(${r}, ${g}, ${b})`;
  }


-9

ลองสิ่งนี้

<div class="torgb" onclick="rgba();" style="background-color:#000; width:20px; height:20px;"></div>
<script>
function rgba(){
$('.torgb').attr('background-color','rgba(0,0,0,1)');
$('.torgb').attr('onclick','hex();');
}
function hex(){
$('.torgb').attr('background-color','#000');
$('.torgb').attr('onclick','rgba();');
}
</script>

อยู่ที่ไหนhexและrgbaฟังก์ชั่นมาจากไหน
Andy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.