Chuyển đổi Hex sang RGBA


86

My fiddle - http://jsbin.com/pitu/1/edit

Tôi muốn thử chuyển đổi hex sang rgba dễ dàng. Tôi đã từng sử dụng trình duyệt hiển thị màu bằng cách sử dụng rgb làm mặc định vì vậy khi sử dụng công cụ chọn màu farbtastic, tôi đang chuyển đổi giá trị hex thành rgb bằng cách lấy màu nền mà giá trị hex tạo ra (như rgb theo mặc định = chuyển đổi đơn giản)

Tôi đã thử thay thế )biểu tượng thành , 1), nhưng điều đó không hiệu quả vì vậy tôi đã đi xem cách chuyển đổi rgb sang rgba sẽ hoạt động như thế nào và tôi vẫn gặp sự cố.

Jquery

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

Mục đích
nhập mô tả hình ảnh ở đây

CHỈNH SỬA :

TinyColor Là một thư viện js thao tác màu tuyệt vời thực hiện mọi thứ tôi muốn ở đây và hơn thế nữa. Tôi nghĩ các bạn có thể muốn thử nó! - https://github.com/bgrins/TinyColor


1
TinyColor Là một thư viện js thao tác màu tuyệt vời thực hiện mọi thứ tôi muốn ở đây và hơn thế nữa. Tôi nghĩ các bạn có thể muốn thử nó!
Michael Schwartz

Câu trả lời:


155
//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
Cảm ơn bạn .. Làm việc như một phép màu .. :)
Manosystem Singh Sahota

4
giải pháp rất dễ hiểu nhưng nó không hỗ trợ 8 dạng hex như thế #ff0000aanào?
supersan

1
Điều này không hoạt động nếu đầu vào không chính xác 3 hoặc 6 ký tự.
Kehlan Krumme

93

@ ElDoRado1239 có ý tưởng đúng, nhưng cũng có một cách rõ ràng hơn:

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
Lưu ý: đây sẽ thất bại trên các phím tắt HEX, ví dụ #fff. Điều đó có thể dễ dàng sửa chữa mặc dù!
Matthew Herbst

1
Vâng, vâng, bạn phải cung cấp cho các chức năng đầu vào đúng ...
AJFarkas

Rất dễ đọc, tôi thích nó hơn nhiều so với giải pháp dựa trên reg exp.
dahrens

Công việc tốt đẹp!! Một điều nhỏ tôi phải đề cập đến mặc dù. Tôi có một số trải nghiệm tồi khi giữ khoảng cách giữa dấu phẩy và các giá trị RGBA trong chuỗi. (ví dụ: rgba (255, 35, 234, 0,5)). Đặc biệt nếu bạn chuyển giá trị này cho một chương trình khác, hãy lưu ý điều đó. Bởi vì có một số chương trình không chấp nhận khoảng trắng giữa các giá trị trong chuỗi. Vì vậy, tốt hơn nên xóa những khoảng trắng đó khỏi đầu ra cuối cùng.
Tharanga

eslintchỉ là thực thi phong cách. Tình cờ là không có gì tôi viết mâu thuẫn với sở thích phong cách của bạn. Trong thực tế, ví dụ như điều này sẽ không vượt qua được dự án mà tôi đang làm.
AJFarkas

34

Hàm ES6 để chỉ xử lý 6 ký tự hex có hoặc không có '#':

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

Sử dụng:

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)

Kể từ khi toStringvào Arraytham gia với ,và đầu vào thực tế có thể rrggbbaa hexbạn có thể thay đổi nó để const rgb = hex.match (...). Lát (0,3) .map (...) returnn` $ {rgb}, $ {alpha } ';
Morteza Tourani

1
mã bên dưới cũng sẽ chuyển đổi 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)); trở lại rgba(${r},${g},${b},${alpha}); };
Serkan KONAKCI

14

Phiên bản TypeScript sạch:

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 `rgba(${r}, ${g}, ${b})`;
  }
}

Dựa trên câu trả lời của @ AJFarkas.


1
Điều này không hoạt động mọi lúc trong một số trường hợp, nó trả về NaN cho r, g hoặc / và b.
Khai mạc

Làm việc cho tôi! Thx
Nghệ sĩ saxophone

10

Bất kỳ phương pháp tiếp cận mô-đun dạng Hex nào

Thách thức chính là tính đến năm 2018, có một số hình thức HEX. Biểu mẫu truyền thống 6 ký tự, biểu mẫu rút gọn 3 ký tự và một biểu mẫu ký tự 4 và 8 mới bao gồm alpha. Hàm sau có thể xử lý bất kỳ biểu mẫu HEX nào.

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)})`
}

Alpha có thể được cung cấp cho hàm theo những cách sau:

  1. Là một phần của mẫu HEX 4 hoặc 8.
  2. Là tham số thứ hai giữa 0-1,

OutPut

    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
Một số trình duyệt hỗ trợ màu Hex với độ mờ, những trình duyệt khác thì không. Câu trả lời này rất hữu ích trong việc chuyển đổi 8 dạng hex sang rgba, rgba được hỗ trợ trong tất cả các trình duyệt.
George

1
@George, Cảm ơn! Sau khi tạo ra điều này, tôi đã tự hỏi mình rằng liệu một cách tiếp cận toàn diện như vậy có thực sự cần thiết hay không. Phản hồi của bạn có giá trị.
Ben Carp

1
Tôi nghĩ có thể có 1 lỗi nhỏ trong alpha calc. Tôi nghĩ nó nên đọc: trả về a / 255 nếu không FF không trả về 1
Dustin Kerstein

@DustinKerstein bắt thật hay! Có lẽ không thể gây hại, nhưng vẫn nên được sửa chữa.
Ben Carp

1
Đây là câu trả lời tốt nhất và nó phù hợp với tôi với tất cả các bài kiểm tra đơn vị.
Menai Ala Eddine - Aladdin

9

Nếu bạn muốn chuyển đổi hex sang rgba thì bạn có thể sử dụng hàm này,

function hex2rgba_convert(hex,opacity){
 hex = hex.replace('#','');
 r = parseInt(hex.substring(0, hex.length/3), 16);
 g = parseInt(hex.substring(hex.length/3, 2*hex.length/3), 16);
 b = parseInt(hex.substring(2*hex.length/3, 3*hex.length/3), 16);

 result = 'rgba('+r+','+g+','+b+','+opacity/100+')';
 return result;
}

Đây là chi tiết là hex sang rgba


8

Đây là một hàm trả về rgb hoặc rgba nếu bạn cung cấp một alpha. Chức năng này cũng chuyển đổi các mã màu hex ngắn.

chức năng:

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 + ')';
   }
}

ví dụ:

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 hiện đại, RegEx miễn phí, giải pháp với chức năng kiểm tra lỗi và mũi tên không đổi, trả về null cho các lỗi. Nếu alpha không được cung cấp thì giá trị mặc định của một được sử dụng:

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

Lưu ý: Nó trả về nullcho các lỗi. Bạn có thể thay thế {return null;}bằng câu lệnh ném:, {throw "Not a valid hex color!";}nhưng sau đó bạn nên gọi nó từ bên trong try-catch:

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

5

Giải pháp JS thuần túy nếu nó giúp:

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+")";
}

"alphaYes" là "true" hoặc "false" tùy thuộc vào việc bạn muốn alpha hay không.

Xem trước


Các elsetừ khóa là không cần thiết trong trường hợp này. Nó sẽ trả về không phải alpha bất kể.
Andy

Ồ, đúng vậy, nhưng điều này có vẻ "gọn gàng" hơn đối với tôi. Tôi đoán chỉ là vấn đề sở thích cá nhân.
ElDoRado1239

Mã này không hoạt động với hex chữ thường (ví dụ. #f0a16e). Tôi đề nghị chuyển đổi hexvới toUpperCaseđầu tiên.
philippe_b

3

Tôi thích câu trả lời @AJFarkas và thêm hỗ trợ cho phím tắt hex (#fff) vào nó

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

Đây là phiên bản ES2015 + phòng thủ hơn một chút và xử lý cú pháp 3 chữ số viết tắt.

/*
 * 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

Và một cái khác dựa trên sự dịch chuyển bit.

// 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

Thử

// 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})`


0

Chuyển đổi HEX với alpha (ahex) sang 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+')';
}

Hãy tự mình thử với đoạn mã:

Tác giả gốc


0

Thêm vào @ ElDoRado1239

Đối với những người muốn chuyển giá trị alpha (đoạn mã typecript):

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

Thử đi

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

Các chức năng hexrgbachức năng đến từ đâu?
Andy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.