Làm thế nào để làm cho một màu nhất định tối hơn một chút hoặc nhạt hơn?


9

Tôi có bức ảnh này:

màu sắc

Các mũi tên cho thấy hai màu khác nhau nhưng thực tế chúng phải cùng màu nhưng nhạt hơn hoặc tối hơn một chút.

Tôi đã tạo ảnh chụp màn hình này cho ứng dụng tôi tạo và màu nâu ở các cạnh chỉ là màu xanh lam được cộng với 30. Như bạn có thể thấy nó không thực hiện được mẹo, tức là thêm 30 vào màu thực tế sẽ không hoạt động màu sắc.

màu sắc thực tế

Làm thế nào tôi có thể chỉ tô một màu nhất định tức là làm cho nó sáng hơn hoặc tối hơn?

Ngoài ra, tôi nên làm gì nếu tôi muốn nó trông giống như bán trong suốt với alpha?


Tôi đang bỏ phiếu để đóng câu hỏi này ngoài chủ đề vì nó nên được hỏi trên stackoverflow.
joojaa

3
Về mặt kỹ thuật, đây vẫn là một câu hỏi thiết kế đồ họa vì chúng ta thảo luận về toán học đằng sau màu sắc và màu bóng, tạo ra các biến thể màu khác nhau.
Vlad

1
không, chúng tôi thảo luận về chuyển đổi thập lục phân. Tôi sẽ ổn với một câu hỏi màu sắc nhưng bạn đã ràng buộc điều này rất nhiều với môi trường tính toán của bạn để nó lâu hơn đáp ứng yêu cầu của bạn. Vì vậy, bạn đã chỉ định nó để trở thành một câu hỏi gật đầu và đánh dấu javascript và đó không phải là thiết kế đồ họa.
joojaa

1
Không có câu hỏi nào nói đúng, tôi nên làm gì để làm cho màu tối hơn hoặc sáng hơn. Chuyển đổi thành giá trị thập lục phân là bổ sung hữu ích nhưng không cần thiết.
Vlad

1
Tôi sẽ không tranh luận. Tôi không hiểu màu sắc và cách chúng hoạt động, tôi đã yêu cầu "làm thế nào", không phải là một đoạn mã mà ai đó sẽ mã hóa cho tôi.
Vlad

Câu trả lời:


12

Câu hỏi hay.

Để làm việc với các giá trị thập lục phân, bạn cần suy nghĩ về tỷ lệ tương đối của các giá trị RGB.

Tôi sẽ sử dụng thang đo bằng số, không phải bằng chữ cái, vì vậy chúng ta có thể thấy toán học đằng sau nó.

Hãy tưởng tượng bạn có một quả cam.

Bạn có thể có giá trị R255 G128 B0

Nếu bạn muốn màu đậm hơn, bạn cần giảm các giá trị chẳng hạn ở mức 50%

Điều này sẽ cung cấp cho bạn R128 G64 B0 Lưu ý rằng tất cả các màu đã được sửa đổi bằng tỷ lệ tỷ lệ.

Một màu phức tạp hơn có thể là R255 G200 B100 Chúng ta hãy làm tối nó nhưng không nhiều như trường hợp trước. Hãy để chúng tôi làm tối nó 80%.

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

Để làm cho một màu sáng hơn, ý tưởng khá giống nhau, nhưng nó khó hơn vì màu sẽ ở mức 255, vì vậy bạn có thể nghĩ về sự khác biệt giữa 255 so với giá trị của bạn.

Ví dụ như cùng một quả cam

R255 G128 B0

Bạn không thể tăng thêm R nữa và bạn không thể tăng Xanh lục và xanh lam với cùng các giá trị, ví dụ: thêm 100, vì bạn sẽ có

R255 G228 B100

cái nào quá vàng

Toán học sẽ là

1) Chênh lệch từ 255 đến giá trị hiện tại (R255 G128 B0) là: R0 G127 B255

2) Hãy để chúng tôi làm cho một màu cam nhạt hơn 50%

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

4) Thêm vào giá trị ban đầu của bạn: R255 + 0 G128 + 64 B0 + 128 = R255 G192 B128.

Tôi đang thêm một hình ảnh để cung cấp cho bạn ý tưởng cơ bản. Các giá trị RGB không giống với văn bản của tôi, chỉ vì một công việc lười biếng, nhưng bạn có thể thấy rằng "cầu thang" màu cam giữ tỷ lệ nội tại của nó.

nhập mô tả hình ảnh ở đây

Đã chỉnh sửa

Tôi thật ngốc. Bạn cũng có thể sử dụng ký hiệu Màu HSL:

{màu nền: hsl (45, 60%, 70%);} và sửa đổi màu thứ ba cho màu tối hơn, và màu thứ hai và thứ ba cho màu nhạt hơn.

Bạn cũng có thể sử dụng một biến thể hsla để bao gồm alpha.


Nếu bạn là một trình duyệt thì nó hoàn toàn có khả năng tính toán cho bạn
joojaa

Có một ứng dụng JS / trình duyệt. Nhưng Js không nhận ra màu được tạo thành # 345464. Tôi sử dụng parseInt (hashString.replace ('#', ''), 16); trong đó hashString là màu được định dạng CSS như # 345464.
Vlad

Bạn dịch số của bạn như bạn muốn. Tôi nói rằng đã sử dụng các con số để bạn có thể thấy toán học đằng sau nó. Nhưng nguyên tắc là như nhau. 8 là một nửa của F.
Rafael

Và bạn luôn có thể sử dụng ký hiệu rgba (255,128,0,1).
Rafael

Actuall tôi sử dụng phần tử Canvas và nó là JS thuần túy, không có CSS. Nhưng tôi có một ý tưởng về cách giải quyết điều này bằng mã.
Vlad

2

Bạn đã hiểu nhầm mọi thứ một chút, javaScript không mô hình hóa màu như hệ thập lục phân, hệ thống cũng không. Ký hiệu thập lục phân chỉ dành cho tài liệu có thể đọc được của con người. Bên trong hệ thống của bạn lưu trữ ba giá trị nguyên. Bạn có thể querry và thao tác trực tiếp.

Nhưng hãy nói rằng bạn muốn thao tác với tài liệu thực tế thay vì hệ thống bên trong. Sau đó, tốt nhất để trì hoãn tính toán của bạn đến một số thư viện làm điều này cho bạn. Bạn thấy trình duyệt có thể thể hiện màu sắc theo nhiều cách, do đó bạn sẽ cần lập trình tất cả các loại trường hợp như đầu vào quảng cáo rgb và hsv. Vì vậy, tôi khuyên bạn nên sử dụng một cái gì đó như Color.js, nó giúp bạn đỡ đau đầu hơn, vì bạn không cần phải tự thực hiện pha trộn, làm tối, làm sáng, v.v.

Chỉnh sửa:

Trong trường hợp bạn muốn tự làm điều này, điều mà tôi không khuyên bạn. Bắt đầu bằng cách biến sự hiện diện hexar thành bộ ba số nguyên hoặc số dấu phẩy động trong phạm vi 0-1, điều này làm cho việc tính toán dễ dàng hơn.

Bây giờ để dễ dàng thao tác chuyển đổi màu giá trị RGB thành HSL hoặc HSB, điều này làm cho việc tính toán độ sáng trở nên tầm thường (Wikipedia có công thức). Vì vậy, sau đó chỉ cần thêm hoặc trừ độ sáng hoặc độ sáng. Đối với mô phỏng ánh sáng thực, việc tính toán đủ dễ dàng chỉ cần nhân màu sáng với màu cơ bản. Do đó, đối với ánh sáng trung tính, nó chỉ đơn giản là:

Kết quả = Cường độ * Màu sắc

Như Rafael giải thích, công thức lặp lại bởi kênh màu. Bạn có thể mô phỏng ánh sáng màu bằng cách làm

Kết quả = Cường độ * LigtColor * Màu

Đối với điều này tốt nhất để chuyển đổi để nổi đầu tiên, có thể tuyến tính cũng. Điều này cho phép ánh sáng ấm áp hoặc mát mẻ trên khu vực của bạn có thể mang lại cảm giác tự nhiên hơn.

Pha trộn alpha (lớp màu trên đầu khác) chỉ đơn giản là

Kết quả = ColorTop * alpha + ColorBottom * (1-alpha)

Chỉnh sửa cuối cùng

Cuối cùng, đây là một số mã làm điều gì đó đối với những gì bạn yêu cầu. Lý do điều này rất khó thấy là loại hình trừu tượng của nó ngay bây giờ. Mã sống có sẵn ở đây

nhập mô tả hình ảnh ở đây

Hình 1 : Kết quả mã bên dưới xem thêm phiên bản trực tiếp .

{
  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 bạn nên hỏi về stackoverflow vì trên thực tế hầu hết điều này có thể được tìm thấy trên stackoverfow.


Thư viện này có thể độc lập không?
Vlad

@Vlad chắc chắn tôi thấy không có lý do tại sao không.
joojaa

Tôi đã thử nó, nó sử dụng một số mô-đun NodeJS, nhưng tôi không muốn làm cho ứng dụng nặng nề trên các thư viện của bên thứ ba. Sẽ cố gắng để tạo mã của riêng tôi.
Vlad

@Vlad đã thêm một số mã cho bạn vào da đầu
joojaa

: D wow, công việc tuyệt vời!
Vlad

1

Bằng tay nếu bạn muốn thay đổi độ tối / độ sáng của màu bằng tay và thậm chí không cần nhìn vào nó. trong hex hoặc rgb thực sự dễ dàng chỉ cần thêm hoặc bớt một lượng ánh sáng bằng nhau cho mỗi kênh.
Giả sử trong rgb, bạn có 132.145.167 yo có thể thêm 30 vào mỗi số để có phiên bản nhẹ hơn cùng màu, vì vậy 162.175.207, và nếu bạn nhận ra bạn đã làm điều đó chỉ bằng một chút thì hãy trừ 2 từ mỗi 160.173.205. Tương tự với hex nhưng trong số hex. vì vậy e4c3d5 là e4 c3 d5, bạn có thể thêm 16 để làm cho nó nhạt hơn f4d3e5 hoặc trừ 16 để tạo ra phiên bản tối hơn có cùng màu d4b3c5.
Bạn có thể thêm hoặc bớt bao nhiêu tùy ý, và bạn sẽ đoán được số lượng đạn phù hợp để thêm và trừ theo thời gian, miễn là bạn thêm cùng một lượng đạn vào cả ba kênh (cả ba số), bạn sẽ chỉ thay đổi cách nhiều màu trắng bạn thêm hoặc loại bỏ khỏi hỗn hợp.


Mát mẻ! Điều này thật dễ dàng và hữu ích cho một người không phải là lập trình viên!
brookdancer
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.