วิธีการแปลงสีในรูปแบบ RGB เป็นรูปแบบ Hex และในทางกลับกัน?
ยกตัวอย่างเช่นแปลงไป'#0080C0'
(0, 128, 192)
วิธีการแปลงสีในรูปแบบ RGB เป็นรูปแบบ Hex และในทางกลับกัน?
ยกตัวอย่างเช่นแปลงไป'#0080C0'
(0, 128, 192)
คำตอบ:
หมายเหตุ : ทั้งสองรุ่นของrgbToHex
คาดหวังค่าจำนวนเต็มสำหรับr
, g
และb
ดังนั้นคุณจะต้องทำปัดเศษของคุณเองหากคุณมีค่าที่ไม่ใช่จำนวนเต็ม
ต่อไปนี้จะทำกับการแปลง RGB เป็นฐานสิบหกและเพิ่มการเติมเต็มศูนย์ใด ๆ ที่ต้องการ:
function componentToHex(c) {
var hex = c.toString(16);
return hex.length == 1 ? "0" + hex : hex;
}
function rgbToHex(r, g, b) {
return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);
}
alert(rgbToHex(0, 51, 255)); // #0033ff
การแปลงวิธีอื่น:
function hexToRgb(hex) {
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result ? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
}
alert(hexToRgb("#0033ff").g); // "51";
ในที่สุดรุ่นทางเลือกของrgbToHex()
ตามที่กล่าวไว้ในคำตอบของ @ casablancaและแนะนำในความคิดเห็นโดย @cwolves:
function rgbToHex(r, g, b) {
return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
}
alert(rgbToHex(0, 51, 255)); // #0033ff
นี่คือเวอร์ชันhexToRgb()
ที่แยกวิเคราะห์ hex triplet hex แบบย่อเช่น "# 03F":
function hexToRgb(hex) {
// Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
hex = hex.replace(shorthandRegex, function(m, r, g, b) {
return r + r + g + g + b + b;
});
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result ? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
}
alert(hexToRgb("#0033ff").g); // "51";
alert(hexToRgb("#03f").g); // "51";
(r << 16)
) จะให้ผลลัพธ์เดียวกันกับคอมพิวเตอร์ endian ทั้งขนาดเล็กและใหญ่หรือไม่? แก้ไข: มันไม่ได้ นี่คือเหตุผล: stackoverflow.com/questions/1041554/…
rgbToHex
ฟังก์ชั่นล่าสุด คุณจะต้องพิมพ์ค่า rgb ที่คุณส่งเป็นจำนวนเต็มหรือแก้ไขฟังก์ชัน rgbToHex เล็กน้อย ตัวอย่าง: jsfiddle.net/cydqo6wj ปัจจุบัน: return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
Modified: return "#" + ((1 << 24) + ((+r) << 16) + ((+g) << 8) + (+b)).toString(16).slice(1);
ในเวอร์ชั่นที่แก้ไขฉันเพียงบังคับค่า rgb ที่จะถูกประเมินค่าเป็นจำนวนเต็มก่อนที่จะเปลี่ยนเป็น 16 / hex
รุ่นอื่นของ hexToRgb:
function hexToRgb(hex) {
var bigint = parseInt(hex, 16);
var r = (bigint >> 16) & 255;
var g = (bigint >> 8) & 255;
var b = bigint & 255;
return r + "," + g + "," + b;
}
แก้ไข: 3/28/2017 นี่คือวิธีการอื่น ที่ดูเหมือนจะเร็วยิ่งขึ้น
function hexToRgbNew(hex) {
var arrBuff = new ArrayBuffer(4);
var vw = new DataView(arrBuff);
vw.setUint32(0,parseInt(hex, 16),false);
var arrByte = new Uint8Array(arrBuff);
return arrByte[1] + "," + arrByte[2] + "," + arrByte[3];
}
แก้ไข: 8/11/2017 วิธีการใหม่ด้านบนหลังจากการทดสอบเพิ่มเติมไม่ได้เร็วขึ้น :( แม้ว่ามันจะเป็นวิธีที่สนุกสลับกัน
return [r, g, b].join();
.
return [(bigint = parseInt(hex, 16)) >> 16 & 255, bigint >> 8 & 255, bigint & 255].join();
#
) ก่อนparseInt
:hex = hex.replace(/[^0-9A-F]/gi, '');
const rgbToHex = (r, g, b) => '#' + [r, g, b].map(x => {
const hex = x.toString(16)
return hex.length === 1 ? '0' + hex : hex
}).join('')
console.log(rgbToHex(0, 51, 255)); // '#0033ff'
[r, g, b]
ส่งกลับอาร์เรย์ "#03F"
การทำงานยังมีแฝดชวเลขฐานสิบหกเช่น
const hexToRgb = hex =>
hex.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i
,(m, r, g, b) => '#' + r + r + g + g + b + b)
.substring(1).match(/.{2}/g)
.map(x => parseInt(x, 16))
console.log(hexToRgb("#0033ff")) // [0, 51, 255]
console.log(hexToRgb("#03f")) // [0, 51, 255]
padStart()
วิธีการconst rgbToHex = (r, g, b) => '#' + [r, g, b]
.map(x => x.toString(16).padStart(2, '0')).join('')
console.log(rgbToHex(0, 51, 255)); // '#0033ff'
โปรดทราบว่าคำตอบนี้ใช้คุณสมบัติ ECMAScript ล่าสุดซึ่งไม่รองรับในเบราว์เซอร์รุ่นเก่า หากคุณต้องการให้รหัสนี้ทำงานได้ในทุกสภาพแวดล้อมคุณควรใช้Babelเพื่อรวบรวมรหัสของคุณ
.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,(m, r, g, b) => '#' + r + r + g + g + b + b)
กลายเป็น: .replace(/^#?([a-f\d])([a-f\d])([a-f\d])([a-f\d])$/i,(m, r, g, b, a) => '#' + r + r + g + g + b + b + a + a)
แต่มีวิธีที่จะทำให้ regexp ทำงานกับ A ของ RGBA เป็นค่าฐานสิบหกตัวเลือก 4 หรือไม่? นั่นจะทำให้การทำงานเสร็จสมบูรณ์ทำให้ regexp หนึ่งทำงานกับ hex RGB และ RGBA มิฉะนั้นมันคือสอง regexps ค่าหนึ่งมี 3 ค่าอีกค่าเป็น 4 คุณต้องหารค่าที่ 4 ด้วย 255 เพื่อรับ arg ที่ 4 สำหรับ rgba ()
นี่คือรุ่นของฉัน:
function rgb2hex(red, green, blue) {
var rgb = blue | (green << 8) | (red << 16);
return '#' + (0x1000000 + rgb).toString(16).slice(1)
}
function hex2rgb(hex) {
// long version
r = hex.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);
if (r) {
return r.slice(1,4).map(function(x) { return parseInt(x, 16); });
}
// short version
r = hex.match(/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i);
if (r) {
return r.slice(1,4).map(function(x) { return 0x11 * parseInt(x, 16); });
}
return null;
}
rgb2hex
วิธีการ ทำไมเรา0x1000000
ถึงเพิ่มrgb
และทำไมเราต้องโทรหา.slice(1)
ในที่สุด?
ฉันสมมติว่าคุณเลขฐานสิบหก HTML #rrggbb
สไตล์เฉลี่ยคือ รหัสของคุณเกือบจะถูกต้องยกเว้นว่าคุณได้รับคำสั่งซื้อกลับด้าน มันควรจะเป็น:
var decColor = red * 65536 + green * 256 + blue;
นอกจากนี้การใช้การเลื่อนบิตอาจทำให้อ่านง่ายขึ้น:
var decColor = (red << 16) + (green << 8) + blue;
var decColor = (red < 16 ? '0' : '') + (red << 16) + (green << 8) + blue;
red < 16
คุณต้องการนำหน้า a 0
ไปยังผลลัพธ์สุดท้าย
var hexColor = ((1 << 24) + (red << 16) + (green << 8) + blue).toString(16).substr(1);
function hex2rgb(hex) {
return ['0x' + hex[1] + hex[2] | 0, '0x' + hex[3] + hex[4] | 0, '0x' + hex[5] + hex[6] | 0];
}
r
, g
, b
:function hex2rgb(hex){return{r:'0x'+hex[1]+hex[2]|0,g:'0x'+hex[3]+hex[4]|0,b:'0x'+hex[5]+hex[6]|0}}
รหัสนี้ยอมรับตัวแปร #fff และ #ffffff และความทึบ
function hex2rgb(hex, opacity) {
var h=hex.replace('#', '');
h = h.match(new RegExp('(.{'+h.length/3+'})', 'g'));
for(var i=0; i<h.length; i++)
h[i] = parseInt(h[i].length==1? h[i]+h[i]:h[i], 16);
if (typeof opacity != 'undefined') h.push(opacity);
return 'rgba('+h.join(',')+')';
}
ฟังก์ชัน HEX หนึ่งบรรทัดถึง RGBA
รองรับทั้งแบบสั้น#fff
และ#ffffff
แบบยาว
รองรับช่องอัลฟา (ทึบ)
ไม่สนใจว่าแฮชระบุหรือไม่ทำงานในทั้งสองกรณี
function hexToRGBA(hex, opacity) {
return 'rgba(' + (hex = hex.replace('#', '')).match(new RegExp('(.{' + hex.length/3 + '})', 'g')).map(function(l) { return parseInt(hex.length%2 ? l+l : l, 16) }).concat(opacity||1).join(',') + ')';
}
ตัวอย่าง:
hexToRGBA('#fff') -> rgba(255,255,255,1)
hexToRGBA('#ffffff') -> rgba(255,255,255,1)
hexToRGBA('#fff', .2) -> rgba(255,255,255,0.2)
hexToRGBA('#ffffff', .2) -> rgba(255,255,255,0.2)
hexToRGBA('fff', .2) -> rgba(255,255,255,0.2)
hexToRGBA('ffffff', .2) -> rgba(255,255,255,0.2)
สิ่งนี้สามารถใช้เพื่อรับสีจากรูปแบบที่คำนวณได้:
function rgbToHex(color) {
color = ""+ color;
if (!color || color.indexOf("rgb") < 0) {
return;
}
if (color.charAt(0) == "#") {
return color;
}
var nums = /(.*?)rgb\((\d+),\s*(\d+),\s*(\d+)\)/i.exec(color),
r = parseInt(nums[2], 10).toString(16),
g = parseInt(nums[3], 10).toString(16),
b = parseInt(nums[4], 10).toString(16);
return "#"+ (
(r.length == 1 ? "0"+ r : r) +
(g.length == 1 ? "0"+ g : g) +
(b.length == 1 ? "0"+ b : b)
);
}
// not computed
<div style="color: #4d93bc; border: 1px solid red;">...</div>
// computed
<div style="color: rgb(77, 147, 188); border: 1px solid rgb(255, 0, 0);">...</div>
console.log( rgbToHex(color) ) // #4d93bc
console.log( rgbToHex(borderTopColor) ) // #ff0000
(r.length == 1 ? "0" + r : r)
และคล้ายกันสำหรับสีเขียวและสีน้ำเงิน
วิธีการแก้ปัญหาบิตตามปกติจะแปลก แต่ในกรณีนี้ฉันคิดว่ามันดูหรูหรากว่า😄
function hexToRGB(hexColor){
return {
red: (hexColor >> 16) & 0xFF,
green: (hexColor >> 8) & 0xFF,
blue: hexColor & 0xFF,
}
}
การใช้งาน:
const {red, green, blue } = hexToRGB(0xFF00FF)
console.log(red) // 255
console.log(green) // 0
console.log(blue) // 255
// ละเว้นเครื่องหมาย hsl ค่าสีมักแสดงเป็นชื่อ, rgb, rgba หรือ hex-
// Hex สามารถเป็น 3 ค่าหรือ 6
// Rgb สามารถเป็นเปอร์เซ็นต์เช่นเดียวกับค่าจำนวนเต็ม
// ดีที่สุดสำหรับบัญชีสำหรับทุกรูปแบบเหล่านี้อย่างน้อย
String.prototype.padZero= function(len, c){
var s= this, c= c || "0", len= len || 2;
while(s.length < len) s= c + s;
return s;
}
var colors={
colornames:{
aqua: '#00ffff', black: '#000000', blue: '#0000ff', fuchsia: '#ff00ff',
gray: '#808080', green: '#008000', lime: '#00ff00', maroon: '#800000',
navy: '#000080', olive: '#808000', purple: '#800080', red: '#ff0000',
silver: '#c0c0c0', teal: '#008080', white: '#ffffff', yellow: '#ffff00'
},
toRgb: function(c){
c= '0x'+colors.toHex(c).substring(1);
c= [(c>> 16)&255, (c>> 8)&255, c&255];
return 'rgb('+c.join(',')+')';
},
toHex: function(c){
var tem, i= 0, c= c? c.toString().toLowerCase(): '';
if(/^#[a-f0-9]{3,6}$/.test(c)){
if(c.length< 7){
var A= c.split('');
c= A[0]+A[1]+A[1]+A[2]+A[2]+A[3]+A[3];
}
return c;
}
if(/^[a-z]+$/.test(c)){
return colors.colornames[c] || '';
}
c= c.match(/\d+(\.\d+)?%?/g) || [];
if(c.length<3) return '';
c= c.slice(0, 3);
while(i< 3){
tem= c[i];
if(tem.indexOf('%')!= -1){
tem= Math.round(parseFloat(tem)*2.55);
}
else tem= parseInt(tem);
if(tem< 0 || tem> 255) c.length= 0;
else c[i++]= tem.toString(16).padZero(2);
}
if(c.length== 3) return '#'+c.join('').toLowerCase();
return '';
}
}
//var c='#dc149c';
//var c='rgb(100%,25%,0)';
//
var c= 'red';
alert(colors.toRgb(c)+'\n'+colors.toHex(c));
@ ทิมเพื่อเพิ่มคำตอบของคุณ (มันน่าอึดอัดใจเล็กน้อยในการแสดงความคิดเห็น)
ตามที่เขียนไว้ฉันพบว่าฟังก์ชัน rgbToHex ส่งคืนสตริงที่มีองค์ประกอบหลังจุดและต้องการให้ค่า r, g, b ตกอยู่ในช่วง 0-255
ฉันแน่ใจว่านี่อาจดูเหมือนชัดเจนที่สุด แต่ใช้เวลาสองชั่วโมงกว่าที่ฉันจะเข้าใจได้และจากนั้นวิธีการดั้งเดิมก็มีบอลลูนถึง 7 บรรทัดก่อนที่ฉันจะรู้ว่าปัญหาของฉันอยู่ที่อื่น ดังนั้นเพื่อประโยชน์ในการประหยัดเวลาและความยุ่งยากอื่น ๆ นี่คือโค้ดที่แก้ไขเล็กน้อยของฉันที่ตรวจสอบสิ่งที่จำเป็นต้องมีก่อนและตัดส่วนที่เกินออกมาของสตริง
function rgbToHex(r, g, b) {
if(r < 0 || r > 255) alert("r is out of bounds; "+r);
if(g < 0 || g > 255) alert("g is out of bounds; "+g);
if(b < 0 || b > 255) alert("b is out of bounds; "+b);
return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1,7);
}
(2017) ฟังก์ชั่นลูกศรเรียงซ้อน SIMPLE ES6
ฉันไม่สามารถต้านทานการแบ่งปันสิ่งนี้สำหรับผู้ที่อาจจะเขียน js ฟังก์ชั่น / compositional ที่ทันสมัยบางอย่างโดยใช้ ES6 นี่คือ liners แบบเนียนบางอันที่ฉันกำลังใช้ในโมดูลสีที่ทำการแก้ไขสีสำหรับการแสดงข้อมูล
โปรดทราบว่านี่ไม่ได้จัดการช่องอัลฟาเลย
const arrayToRGBString = rgb => `rgb(${rgb.join(',')})`;
const hexToRGBArray = hex => hex.match(/[A-Za-z0-9]{2}/g).map(v => parseInt(v, 16));
const rgbArrayToHex = rgb => `#${rgb.map(v => v.toString(16).padStart(2, '0')).join('')}`;
const rgbStringToArray = rgb => rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/).splice(1, 3)
.map(v => Number(v));
const rgbStringToHex = rgb => rgbArrayToHex(rgbStringToArray(rgb));
ลอง
let hex2rgb= c=> `rgb(${c.substr(1).match(/../g).map(x=>+`0x${x}`)})`;
let rgb2hex= c=>'#'+c.match(/\d+/g).map(x=>(+x).toString(16).padStart(2,0)).join``
หากคุณต้องการเปรียบเทียบค่าสีสองค่า (กำหนดเป็น RGB, ชื่อสีหรือค่าฐานสิบหก) หรือแปลงเป็น HEX ให้ใช้วัตถุผ้าใบ HTML5
var canvas = document.createElement("canvas");
var ctx = this.canvas.getContext('2d');
ctx.fillStyle = "rgb(pass,some,value)";
var temp = ctx.fillStyle;
ctx.fillStyle = "someColor";
alert(ctx.fillStyle == temp);
คุณจะเป็นแบบนี้ได้ไหม
function RGB2HTML(red, green, blue)
{
return '#' + red.toString(16) +
green.toString(16) +
blue.toString(16);
}
alert(RGB2HTML(150, 135, 200));
แสดง # 9687c8
สำหรับฟังก์ชั่น hexToRgb 3 หลักของ Tim Down สามารถปรับปรุงได้ดังต่อไปนี้:
var hex2Rgb = function(hex){
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})|([a-f\d]{1})([a-f\d]{1})([a-f\d]{1})$/i.exec(hex);
return result ? {
r: parseInt(hex.length <= 4 ? result[4]+result[4] : result[1], 16),
g: parseInt(hex.length <= 4 ? result[5]+result[5] : result[2], 16),
b: parseInt(hex.length <= 4 ? result[6]+result[6] : result[3], 16),
toString: function() {
var arr = [];
arr.push(this.r);
arr.push(this.g);
arr.push(this.b);
return "rgb(" + arr.join(",") + ")";
}
} : null;
};
ฉันเจอปัญหานี้เนื่องจากฉันต้องการยอมรับค่าสีใด ๆ และสามารถเพิ่มความทึบได้ดังนั้นฉันจึงสร้างปลั๊กอิน jQuery ด่วนนี้ซึ่งใช้ Canvas ดั้งเดิมบนเบราว์เซอร์สมัยใหม่ ดูเหมือนว่าจะทำงานได้ดีเพียง
แก้ไข
ปรากฎว่าฉันไม่สามารถหาวิธีที่จะทำให้มันเป็นปลั๊กอิน jQuery ที่เหมาะสมดังนั้นฉันจะแสดงมันเป็นฟังก์ชั่นปกติ
//accepts any value like '#ffffff', 'rgba(255,255,255,1)', 'hsl(0,100%,100%)', or 'white'
function toRGBA( c ) {
var
can = document.createElement( 'canvas' ),
ctx = can.getContext( '2d' );
can.width = can.height = 1;
ctx.fillStyle = c;
console.log( ctx.fillStyle ); //always css 6 digit hex color string, e.g. '#ffffff'
ctx.fillRect( 0, 0, 1, 1 ); //paint the canvas
var
img = ctx.getImageData( 0, 0, 1, 1 ),
data = img.data,
rgba = {
r: data[ 0 ], //0-255 red
g: data[ 1 ], //0-255 green
b: data[ 2 ], //0-255 blue
a: data[ 3 ] //0-255 opacity (0 being transparent, 255 being opaque)
};
return rgba;
};
ฉันต้องการฟังก์ชั่นที่ยอมรับค่าที่ไม่ถูกต้องเช่นกัน
rgb (-255, 255, 255) rgb (510, 255, 255)
นี่เป็นคำตอบที่แยกออกจาก @cwolves
function rgb(r, g, b) {
this.c = this.c || function (n) {
return Math.max(Math.min(n, 255), 0)
};
return ((1 << 24) + (this.c(r) << 16) + (this.c(g) << 8) + this.c(b)).toString(16).slice(1).toUpperCase();
}
R = HexToR("#FFFFFF");
G = HexToG("#FFFFFF");
B = HexToB("#FFFFFF");
function HexToR(h) {return parseInt((cutHex(h)).substring(0,2),16)}
function HexToG(h) {return parseInt((cutHex(h)).substring(2,4),16)}
function HexToB(h) {return parseInt((cutHex(h)).substring(4,6),16)}
function cutHex(h) {return (h.charAt(0)=="#") ? h.substring(1,7):h}
ใช้ฟังก์ชั่นเหล่านี้เพื่อให้ได้ผลลัพธ์โดยไม่มีปัญหาใด ๆ :)
function rgbToHex(a){
a=a.replace(/[^\d,]/g,"").split(",");
return"#"+((1<<24)+(+a[0]<<16)+(+a[1]<<8)+ +a[2]).toString(16).slice(1)
}
document.write(rgbToHex("rgb(255,255,255)"));
function rgbToHex(a){
if(~a.indexOf("#"))return a;
a=a.replace(/[^\d,]/g,"").split(",");
return"#"+((1<<24)+(+a[0]<<16)+(+a[1]<<8)+ +a[2]).toString(16).slice(1)
}
document.write("rgb: "+rgbToHex("rgb(255,255,255)")+ " -- hex: "+rgbToHex("#e2e2e2"));
ในขณะที่คำตอบนี้ไม่น่าจะพอดีกับคำถามอย่างสมบูรณ์ แต่อาจมีประโยชน์มากไม่น้อย
var toRgb = document.createElement('div');
toRg.style.color = "hsl(120, 60%, 70%)";
> toRgb.style.color;
< "rgb(133, 225, 133)"
สีของคุณถูกแปลงเป็น Rgb
ใช้งานได้กับ: Hsl, Hex
ไม่ทำงานสำหรับ: สีที่ระบุชื่อ
hex2rbg รุ่นของฉัน:
String.replace, String.split, String.match
ฯลฯคุณอาจต้องลบ hex.trim () หากคุณใช้ IE8
เช่น
hex2rgb('#fff') //rgb(255,255,255)
hex2rgb('#fff', 1) //rgba(255,255,255,1)
hex2rgb('#ffffff') //rgb(255,255,255)
hex2rgb('#ffffff', 1) //rgba(255,255,255,1)
รหัส:
function hex2rgb (hex, opacity) {
hex = hex.trim();
hex = hex[0] === '#' ? hex.substr(1) : hex;
var bigint = parseInt(hex, 16), h = [];
if (hex.length === 3) {
h.push((bigint >> 4) & 255);
h.push((bigint >> 2) & 255);
} else {
h.push((bigint >> 16) & 255);
h.push((bigint >> 8) & 255);
}
h.push(bigint & 255);
if (arguments.length === 2) {
h.push(opacity);
return 'rgba('+h.join()+')';
} else {
return 'rgb('+h.join()+')';
}
}
ตัวอย่างนี้แปลง hex เป็น rgb และ rgb เป็น hex
function hexToRgb(str) {
if ( /^#([0-9a-f]{3}|[0-9a-f]{6})$/ig.test(str) ) {
var hex = str.substr(1);
hex = hex.length == 3 ? hex.replace(/(.)/g, '$1$1') : hex;
var rgb = parseInt(hex, 16);
return 'rgb(' + [(rgb >> 16) & 255, (rgb >> 8) & 255, rgb & 255].join(',') + ')';
}
return false;
}
function rgbToHex(red, green, blue) {
var out = '#';
for (var i = 0; i < 3; ++i) {
var n = typeof arguments[i] == 'number' ? arguments[i] : parseInt(arguments[i]);
if (isNaN(n) || n < 0 || n > 255) {
return false;
}
out += (n < 16 ? '0' : '') + n.toString(16);
}
return out
}
ฉันทำงานกับข้อมูล XAML ที่มีรูปแบบเลขฐานสิบของ #AARRGGBB (Alpha, Red, Green, Blue, Blue) ใช้คำตอบข้างต้นนี่คือทางออกของฉัน:
function hexToRgba(hex) {
var bigint, r, g, b, a;
//Remove # character
var re = /^#?/;
var aRgb = hex.replace(re, '');
bigint = parseInt(aRgb, 16);
//If in #FFF format
if (aRgb.length == 3) {
r = (bigint >> 4) & 255;
g = (bigint >> 2) & 255;
b = bigint & 255;
return "rgba(" + r + "," + g + "," + b + ",1)";
}
//If in #RRGGBB format
if (aRgb.length >= 6) {
r = (bigint >> 16) & 255;
g = (bigint >> 8) & 255;
b = bigint & 255;
var rgb = r + "," + g + "," + b;
//If in #AARRBBGG format
if (aRgb.length == 8) {
a = ((bigint >> 24) & 255) / 255;
return "rgba(" + rgb + "," + a.toFixed(1) + ")";
}
}
return "rgba(" + rgb + ",1)";
}
สำหรับการแปลงโดยตรงจาก jQuery คุณสามารถลอง:
function rgbToHex(color) {
var bg = color.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
function hex(x) {
return ("0" + parseInt(x).toString(16)).slice(-2);
}
return "#" + hex(bg[1]) + hex(bg[2]) + hex(bg[3]);
}
rgbToHex($('.col-tab-bar .col-tab span').css('color'))
function getRGB(color){
if(color.length == 7){
var r = parseInt(color.substr(1,2),16);
var g = parseInt(color.substr(3,2),16);
var b = parseInt(color.substr(5,2),16);
return 'rgb('+r+','+g+','+b+')' ;
}
else
console.log('Enter correct value');
}
var a = getRGB('#f0f0f0');
if(!a){
a = 'Enter correct value';
}
a;
พิจารณาคำตอบจำนวนมากเพียงบางส่วนเท่านั้นตอบคำถาม (จาก RGB ถึง HEX หรือวิธีอื่น ๆ ) ฉันคิดว่าฉันโพสต์คำตอบบางส่วนของฉันเช่นกัน
ฉันมีปัญหาที่คล้ายกันและฉันต้องการทำสิ่งนี้: ใส่สี CSS ที่ถูกต้อง (HSL (a), RGB (a), HEX หรือชื่อสี) และ 1. สามารถเพิ่มหรือลบค่า alpha, 2 ส่งคืนวัตถุ rgb (a) ฉันเขียนปลั๊กอินเพื่อจุดประสงค์นี้อย่างแน่นอน มันสามารถพบได้ในGitHub (มันต้องมี jQuery แต่ถ้าคุณต้องการคุณสามารถแยกมันและทำรุ่นวานิลลา) นี่คือหน้าสาธิต คุณสามารถลองด้วยตัวเองและดูผลลัพธ์ที่สร้างขึ้นได้ทันที
ฉันจะคัดลอกตัวเลือกที่นี่:
ตัวสร้าง RGB ยอมรับอาร์กิวเมนต์หนึ่งตัวสีและมีสามตัวเลือก: asObject, addAlpha และ removeAlpha เมื่อละเว้นสามตัวเลือกสี RGB จะถูกส่งกลับเป็นสตริง
$.rgbGenerator("white")
// Will return rgb(255,255,255)
โปรดทราบว่าโดยรวมองค์ประกอบอัลฟาเริ่มต้นจะรวมอยู่ หากค่าอินพุตมีค่าอัลฟาเอาต์พุตจะอยู่ในรูปแบบ RGBa
$.rgbGenerator("hsla(0,100%,50%,0.8)")
// Will return rgba(255,0,0,0.8)
คุณสามารถปิดใช้งานพฤติกรรมนี้ได้โดยตั้งค่า removeAlpha เป็น true สิ่งนี้จะลบค่าอัลฟาจากสี HSLa หรือ RGBa เริ่มต้น
$.rgbGenerator("hsla(0,100%,50%,0.8)", {removeAlpha: true})
// Will return rgb(255,0,0)
หากในอีกทางหนึ่งคุณต้องการเพิ่มช่องอัลฟาคุณสามารถทำได้โดยการตั้งค่า addAlpha ให้เป็นค่าใด ๆ ระหว่าง 0 ถึง 1 เมื่ออินพุตเป็นสีที่ไม่โปร่งใสค่าอัลฟาจะถูกเพิ่มเข้าไป หากเป็นค่าโปร่งใสค่าที่ให้จะเขียนทับองค์ประกอบอัลฟาของอินพุต
$.rgbGenerator("hsl(0,100%,50%)", {addAlpha: 0.4})
// Will return rgba(255,0,0,0.4)
$.rgbGenerator("hsla(0,100%,50%,0.8)", {addAlpha: 0.4})
// Will return rgba(255,0,0,0.4)
ในที่สุดก็เป็นไปได้ที่จะส่งออกสี RGB (a) เป็นวัตถุ มันจะประกอบด้วย r, g, b และเลือก a
$.rgbGenerator("hsla(0,100%,50%,0.8)", {asObject: true})
/* Will return
{
"r": 255,
"g": 0,
"b": 0,
"a": 0.8
}
*/
$.rgbGenerator("hsla(0,100%,50%,0.8)", {asObject: true}).r
// Will return 255
คำตอบที่ได้รับคะแนนสูงสุดโดย Tim Down เป็นทางออกที่ดีที่สุดที่ฉันเห็นสำหรับการแปลงเป็น RGB ฉันชอบโซลูชันนี้สำหรับการแปลง Hex ที่ดีกว่า แต่เนื่องจากมีการตรวจสอบขอบเขตที่กระชับที่สุดและไม่มีการเติมเต็มสำหรับการแปลงเป็น Hex
function RGBtoHex (red, green, blue) {
red = Math.max(0, Math.min(~~this.red, 255));
green = Math.max(0, Math.min(~~this.green, 255));
blue = Math.max(0, Math.min(~~this.blue, 255));
return '#' + ('00000' + (red << 16 | green << 8 | blue).toString(16)).slice(-6);
};
การใช้กะซ้าย '<<' และหรือ '|' ตัวดำเนินการทำให้เป็นโซลูชันที่สนุกเช่นกัน
ฉันพบสิ่งนี้และเพราะฉันคิดว่ามันค่อนข้างตรงไปตรงมาและมีการทดสอบการตรวจสอบและรองรับค่าอัลฟ่า (ตัวเลือก) สิ่งนี้จะพอดีกับกรณี
เพียงแสดงความคิดเห็นในบรรทัด regex หากคุณรู้ว่าคุณกำลังทำอะไรอยู่และมันเร็วขึ้นเล็กน้อย
function hexToRGBA(hex, alpha){
hex = (""+hex).trim().replace(/#/g,""); //trim and remove any leading # if there (supports number values as well)
if (!/^(?:[0-9a-fA-F]{3}){1,2}$/.test(hex)) throw ("not a valid hex string"); //Regex Validator
if (hex.length==3){hex=hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2]} //support short form
var b_int = parseInt(hex, 16);
return "rgba("+[
(b_int >> 16) & 255, //R
(b_int >> 8) & 255, //G
b_int & 255, //B
alpha || 1 //add alpha if is set
].join(",")+")";
}
<<
เป็นโอเปอเรเตอร์กะระดับซ้าย สมมติว่าg
เป็นจำนวนเต็มที่ไม่เป็นศูนย์g << 8
ดังนั้นคูณg
ด้วย 256 ได้อย่างมีประสิทธิภาพโดยเพิ่มศูนย์ไปยังจุดสิ้นสุดของการแสดงเลขฐานสิบหก ในทำนองเดียวกันr << 16
เพิ่ม 4 ศูนย์ เพิ่ม1 << 24
(1000000 ในฐานสิบหก) เพื่อให้แน่ใจว่าเป็นตัวแทนฐานสิบหกเป็นซ้ายเบาะกับเลขใด ๆ ที่จำเป็นเมื่อนำถูกถอดใช้1
slice()
ตัวอย่างเช่นถ้าr
และg
ทั้งคู่เป็นศูนย์และb
เท่ากับ 51((r << 16) + (g << 8) + b).toString(16)
จะส่งคืนสตริง "33" เพิ่ม1 << 24
และคุณจะได้รับ "1000033" จากนั้นถอด1
และคุณอยู่ที่นั่น