วิธีทำให้สีเข้มขึ้นหรือเข้มขึ้นเล็กน้อย


9

ฉันมีรูปนี้:

สี

ลูกศรแสดงสองสีที่แตกต่างกัน แต่อันที่จริงพวกเขาควรเป็นสีเดียวกัน แต่จะจางลงหรือเข้มขึ้นเล็กน้อย

ฉันทำสกรีนช็อตของแอปพลิเคชันที่ฉันทำและสีน้ำตาลที่ขอบเป็นเพียงสีฟ้าบวกกับ 30 อย่างที่คุณเห็นว่ามันไม่ได้ทำเคล็ดลับนั่นคือการเพิ่ม 30 ลงไปในสีจริงจะไม่ได้ผลสำหรับทุกคน สี

สีจริง

ฉันจะแรเงาสีที่กำหนดเช่นทำให้สว่างขึ้นหรือเข้มขึ้นได้อย่างไร

นอกจากนี้ฉันควรทำอย่างไรถ้าฉันต้องการให้กึ่งโปร่งใสด้วย alpha


ฉันลงคะแนนให้ปิดคำถามนี้เป็นหัวข้อนอกเพราะควรถามใน stackoverflow
joojaa

3
ในทางเทคนิคแล้วคำถามนี้ยังคงเป็นคำถามเกี่ยวกับการออกแบบกราฟิกเพราะเราพูดถึงคณิตศาสตร์เบื้องหลังสีและสีแรเงา
Vlad

1
ไม่เราคุยเรื่องการแปลงเลขฐานสิบหก ฉันจะตอบคำถามสีได้ดี แต่คุณได้ผูกพันกับสิ่งนี้อย่างหนักกับสภาพแวดล้อมการคำนวณของคุณ ดังนั้นคุณได้ระบุว่ามันจะกลายเป็นคำถามแบบจาวาสคริปต์และมาร์กอัปและนั่นไม่ใช่การออกแบบกราฟิก
joojaa

1
ไม่มีคำถามที่บอกว่าถูกต้องฉันควรทำอย่างไรเพื่อให้สีเข้มขึ้นหรือสว่างขึ้น การแปลงเป็นค่าเลขฐานสิบหกนั้นเป็นประโยชน์เพิ่มเติม แต่ไม่จำเป็น
Vlad

1
ฉันจะไม่เถียง ฉันไม่เข้าใจสีและวิธีการทำงานฉันถามหา "วิธีการ" ไม่ใช่รหัสที่ใครบางคนจะเขียนให้ฉัน
Vlad

คำตอบ:


13

คำถามเจ๋ง

ในการทำงานกับค่าเลขฐานสิบหกคุณต้องคิดในแง่ของสัดส่วนสัมพัทธ์ของค่า RGB

ฉันจะใช้มาตราส่วนเป็นตัวเลขไม่ใช่ด้วยตัวอักษรดังนั้นเราจึงสามารถดูคณิตศาสตร์ได้

ลองนึกภาพคุณมีส้ม

คุณสามารถมีค่าR255 G128 B0

ถ้าคุณต้องการสีเข้มคุณต้องลดค่าเช่น 50%

สิ่งนี้จะทำให้คุณR128 G64 B0สังเกตว่าสีทั้งหมดได้รับการแก้ไขโดยใช้สัดส่วน

สีที่มีความซับซ้อนมากขึ้นอาจเป็นR255 G200 B100ให้เรามืดลง แต่ไม่มากเท่ากับเคสก่อนหน้า ขอให้เรามืดลงหนึ่ง% 80%

R255x0.8 G200x0.8 B100x0.8 = R204 G160 B80

หากต้องการทำให้สีอ่อนลงความคิดนั้นเหมือนกันมาก แต่มันยุ่งยากกว่าเพราะสีจะมีค่าสูงสุดที่ 255 ดังนั้นคุณสามารถคิดถึงความแตกต่างระหว่าง 255 ถึงค่าของคุณ

ตัวอย่างเช่นส้มเดียวกัน

R255 G128 B0

คุณไม่สามารถเพิ่ม R ได้อีกต่อไปและคุณไม่สามารถเพิ่มสีเขียวและสีน้ำเงินที่มีค่าเดียวกันเช่น 100 ขึ้นไปเพราะคุณจะมี

R255 G228 B100

ซึ่งเหลืองเกินไป

คณิตศาสตร์จะเป็น

1)ความแตกต่างจาก 255 ถึงมูลค่าปัจจุบัน (R255 G128 B0) คือ: R0 G127 B255

2)ให้เราทำสีส้มอ่อน ๆ 50%

3) Rx50% Gx50% Bx50% = R0 G64 B128

4)เพิ่มเข้าไปในค่าเริ่มต้นของคุณ: R255 + 0 G128 + 64 B0 + 128 = R255 G192 B128

ฉันกำลังเพิ่มภาพเพื่อให้แนวคิดพื้นฐานแก่คุณ ค่า RGB ไม่เหมือนกับข้อความของฉันเพียงเพราะงานสันหลังยาว แต่คุณจะเห็นว่า "บันได" สีส้มยังคงสัดส่วนที่แท้จริง

ป้อนคำอธิบายรูปภาพที่นี่

แก้ไข

ฉันโง่มาก คุณยังสามารถใช้สัญลักษณ์สี HSL:

{background-color: hsl (45, 60%, 70%);} และปรับเปลี่ยนสีที่สามสำหรับสีที่เข้มกว่าและที่สองและสามสำหรับสีที่อ่อนกว่า

คุณยังสามารถใช้ตัวแปร hsla เพื่อรวมอัลฟ่า


Offcourse ถ้านี่คือเบราว์เซอร์มันสามารถคำนวณได้อย่างสมบูรณ์แบบสำหรับคุณ
joojaa

ใช่แอปพลิเคชัน JS / เบราว์เซอร์ แต่ Js ไม่รู้จักสีที่มีการจัดรูปแบบ # 345464 ฉันใช้ parseInt (hashString.replace ('#', ''), 16); โดยที่ hashString เป็น CSS ที่มีการจัดรูปแบบสีเช่น # 345464
Vlad

คุณแปลตัวเลขตามที่คุณต้องการ ฉันบอกว่าใช้ตัวเลขเพื่อให้คุณเห็นคณิตศาสตร์อยู่ข้างหลัง แต่หลักการเหมือนกัน 8 คือครึ่งหนึ่งของ F.
Rafael

และคุณสามารถใช้สัญกรณ์ rgba (255,128,0,1) ได้ตลอดเวลา
Rafael

ที่จริงฉันใช้องค์ประกอบ Canvas และเป็น JS บริสุทธิ์ไม่มี CSS inculded แต่ฉันมีความคิดเกี่ยวกับวิธีแก้ปัญหานี้ด้วยรหัส
Vlad

2

คุณมีความเข้าใจผิดในเรื่องเล็กน้อยจาวาสคริปต์จะไม่สร้างสีเป็นเลขฐานสิบหกและไม่มีทั้งระบบ สัญกรณ์เลขฐานสิบหกเป็นเพียงสำหรับเอกสารที่มนุษย์อ่านได้ ภายในระบบของคุณจะเก็บค่าจำนวนเต็มสามค่า คุณสามารถ querry และจัดการเหล่านั้นโดยตรง

แต่ขอเพียงบอกว่าคุณต้องการจัดการเอกสารจริงแทนที่จะเป็นระบบภายใน ดังนั้นจึงเป็นการดีที่สุดที่จะเลื่อนการคำนวณของคุณไปยังห้องสมุดบางแห่งที่ทำสิ่งนี้เพื่อคุณ คุณเห็นว่าเบราว์เซอร์สามารถแสดงสีได้หลายวิธีดังนั้นคุณจะต้องตั้งโปรแกรมทุกกรณีเช่น ad rgb และ hsv input ดังนั้นฉันขอแนะนำให้คุณใช้สิ่งที่คล้ายกับColor.js ซึ่งจะช่วยลดอาการปวดหัวของคุณได้มากเนื่องจากคุณไม่จำเป็นต้องใช้การผสมการทำให้สีเข้มขึ้นการลดน้ำหนัก ฯลฯ ... ด้วยตัวคุณเอง

Edity:

ในกรณีที่คุณต้องการทำด้วยตัวเองซึ่งฉันไม่แนะนำ เริ่มต้นด้วยการเปลี่ยนการนำเสนอเลขฐานสิบหกให้เป็นจำนวนสามเท่าของจำนวนเต็มหรือตัวเลขทศนิยมในช่วง 0-1 ทำให้การคำนวณง่ายขึ้น

ตอนนี้สำหรับการแปลงค่าสี RGB เป็น HSL หรือ HSB อย่างง่ายดายทำให้การคำนวณความสว่างเป็นเรื่องเล็กน้อย (Wikipedia มีสูตร) ดังนั้นเพียงแค่เพิ่มหรือลบความสว่างหรือความสว่าง สำหรับการจำลองแสงจริงการคำนวณนั้นง่ายพอเพียงแค่การคูณแสงสีด้วยสีพื้นฐาน ดังนั้นสำหรับแสงที่เป็นกลางเพียง:

ผล = ความเข้ม * สี

ดังที่ราฟาเอลอธิบายสูตรซ้ำโดยช่องสี คุณสามารถจำลองแสงสีโดยการทำ

ผล = ความเข้ม * LigtColor * สี

เพื่อที่ดีที่สุดในการแปลงให้ลอยก่อนอาจเป็นเส้นตรง ช่วยให้แสงที่อุ่นหรือเย็นบนพื้นที่ของคุณซึ่งสามารถนำความรู้สึกที่เป็นธรรมชาติมากขึ้น

การผสมอัลฟา (เลเยอร์สีที่ด้านบนของอื่น ๆ ) เป็นเพียง

ผล = ColorTop * alpha + ColorBottom * (1-alpha)

การแก้ไขครั้งสุดท้าย

ในที่สุดนี่คือรหัสบางอย่างที่ทำสิ่งที่คุณต้องการ เหตุผลที่ยากต่อการมองเห็นก็คือรูปแบบนามธรรมในขณะนี้ มีรหัสสดที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

ภาพที่ 1 : ผลการโค้ดด้านล่างดูชีวิต

{
  var canvas = document.getElementById('canvas');
  if (canvas.getContext) {
    var ctx = canvas.getContext('2d');

    var Color = function(r, g, b) {
      this.r = r;
      this.g = g;
      this.b = b;
    }
    Color.prototype.asHex = function() {
      return "#" + ((1 << 24) + (this.r << 16) + (this.g << 8) + this.b).toString(16).slice(1);
    }
    Color.prototype.asRGB = function() {
      return 'rgb(' + this.r + ',' + this.g + ',' + this.b + ')';
    }
    Color.prototype.blendWith = function(col, a) {
      r = Math.round(col.r * (1 - a) + this.r * a);
      g = Math.round(col.g * (1 - a) + this.g * a);
      b = Math.round(col.b * (1 - a) + this.b * a);
      return new Color(r, g, b);
    }
    Color.prototype.Mul = function(col, a) {
      r = Math.round(col.r/255 * this.r * a);
      g = Math.round(col.g/255 * this.g * a);
      b = Math.round(col.b/255 * this.b * a);
      return new Color(r, g, b);
    }
    Color.prototype.fromHex = function(hex) {
      // http://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb
      hex = hex.substring(1,7)
      var bigint = parseInt(hex, 16);
      this.r = (bigint >> 16) & 255;
      this.g = (bigint >> 8) & 255;
      this.b = bigint & 255;
    }

    ctx.font = "16px Arial";
    ctx.fillText("Manual Alpha Blend", 18, 20);

    var a = new Color(220, 0, 150);

    var b = new Color();
    b.fromHex('#00C864');

    //Alpha blend
    ctx.fillStyle = a.asHex();
    ctx.fillRect(25, 25, 100, 100);
    ctx.fillStyle = '#FFFFFF';
    ctx.fillText(a.asHex(), 30, 45);
    ctx.fillStyle = b.asRGB()
    ctx.fillRect(50, 50, 100, 100);
    ctx.fillStyle = '#FFFFFF';
    ctx.fillText(a.asHex(), 55, 145);
    var bl = a.blendWith(b, 0.3);
    ctx.fillStyle = bl.asRGB();
    ctx.fillRect(50, 50, 75, 75);
    ctx.fillStyle = '#FFFFFF';
    ctx.fillText(bl.asHex(), 55, 70);

    // lighten 1

    ctx.fillStyle = '#000000';
    ctx.fillText('Neutral Light', 200, 20);

    var c = new Color(100, 100, 100);
    var purelight= new Color(255, 255, 255);

    ctx.fillStyle = c.asRGB();
    ctx.fillRect(200, 25, 100, 100);

    var bl = c.Mul(purelight,1.2);
    ctx.fillStyle = bl.asRGB();
    ctx.fillRect(225, 50, 100, 100);

    var bl = c.Mul(purelight, 0.8);
    ctx.fillStyle = bl.asRGB();
    ctx.fillRect(250, 75, 100, 100);

     // lighten 2

    ctx.fillStyle = '#000000';
    ctx.fillText('Yellowish Light', 400, 20);

    var c = new Color(100, 100, 100);
    var yellowlight= new Color(255, 255, 220);

    var bl = c.Mul(yellowlight,1.0);
    ctx.fillStyle = bl.asRGB();
    ctx.fillRect(400, 25, 100, 100);

    var bl = c.Mul(yellowlight,1.2);
    ctx.fillStyle = bl.asRGB();
    ctx.fillRect(425, 50, 100, 100);

    var bl = c.Mul(yellowlight, 0.8);
    ctx.fillStyle = bl.asRGB();
    ctx.fillRect(450, 75, 100, 100);
  }
}

PS คุณควรถามใน stackoverflow เนื่องจากความจริงทั้งหมดนี้สามารถพบได้ใน stackoverfow


ไลบรารีนี้เป็นแบบสแตนด์อโลนหรือไม่
Vlad

@ ดีใจมากฉันไม่เห็นเหตุผลว่าทำไม
joojaa

ฉันลองใช้มันใช้โมดูล NodeJS บางตัว แต่ฉันไม่ต้องการทำให้แอปหนักในไลบรารีของบุคคลที่สาม จะพยายามทำรหัสของตัวเอง
Vlad

@Vlad เพิ่มรหัสเพื่อให้คุณถลกหนัง
joojaa

: D ว้าวทำงานได้ดีมาก!
ว.

1

ด้วยตนเองถ้าคุณต้องการเปลี่ยนความมืด / ความสว่างของสีด้วยมือและโดยไม่ต้องดูมัน ในฐานสิบหกหรือ rgb เป็นเรื่องง่าย เพียงแค่เพิ่มหรือย่อจำนวนแสงเท่ากันให้แต่ละช่อง
พูดในรูปแบบ rgb คุณมี 132,145,167 yo สามารถเพิ่ม 30 ลงในแต่ละหมายเลขเพื่อให้ได้สีอ่อนกว่าเดิมดังนั้น 162,175,207 และถ้าคุณรู้ว่าคุณทำเสร็จแล้วเพียงแค่ลบ 2 จาก 160,173,205 เหมือนกันกับเลขฐานสิบหก แต่เป็นตัวเลขฐานสิบหก ดังนั้น e4c3d5 คือ e4 c3 d5 คุณสามารถเพิ่ม 16 เพื่อทำให้มันเบากว่า f4d3e5 หรือลบ 16 เพื่อให้รุ่นที่เข้มกว่าที่มีสีเดียวกัน d4b3c5
คุณสามารถเพิ่มหรือย่อท้ายได้มากเท่าที่คุณต้องการและคุณจะดีกว่าที่จะคาดเดาจำนวนเงินที่ถูกต้องเพื่อเพิ่มและย่อเวลาล่วงเวลาตราบใดที่คุณเพิ่มจำนวนกระสุนเท่ากันให้กับทั้งสามช่องทาง (ทั้งสามหมายเลข) คุณจะเปลี่ยนวิธี ขาวมากคุณเพิ่มหรือลบออกจากส่วนผสม


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