Як зробити даний колір трохи темнішим або світлішим?


9

Я маю цю фотографію:

кольори

Стрілки показують два різних кольори, але насправді вони повинні бути одного кольору, але трохи світлішими або темнішими.

Я зробив цей знімок екрана програми, яку я роблю, і коричневий колір на краях - це лише синій колір, підсумований з 30. Як ви бачите, це не робить трюку, тобто додавання 30 до фактичного кольору буде працювати не для всіх кольори.

власне кольори

Як я можу просто відтінити даний колір, тобто зробити його яскравішим або темнішим?

Також що мені робити, якщо я хочу, щоб він виглядав напівпрозорим з альфа?


Я голосую за те, щоб закрити це питання поза темою, оскільки його слід задавати на stackoverflow.
joojaa

3
Технічно це все-таки питання графічного дизайну, оскільки ми обговорюємо математику за кольорами та затіненням кольорів, створюючи різні варіанти кольорів.
Влад

1
ні, ми не обговорюємо шістнадцяткове перетворення. Я був би в порядку з питанням кольору, але ви настільки сильно зв'язали це з обчислювальним середовищем, що воно більше не задовольняє вашу заяву. Таким чином, ви вказали, що це стало питанням JavaScript та розмітки, і це не графічний дизайн.
joojaa

1
Жодне запитання не відповідає правильно, що мені робити, щоб колір був темнішим або яскравішим. Перетворення в шістнадцяткове значення є корисним доповненням, але не є необхідністю.
Влад

1
Я не збираюся сперечатися. Я не розумію кольори та те, як вони працюють, я просив "як", а не фрагмент коду, який хтось буде кодувати мені.
Влад

Відповіді:


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 для включення альфа.


Зрозуміло, якщо це браузер, він цілком здатний обчислити це для вас
joojaa

Так, програма JS / браузер. Але Js не розпізнає формований колір # 345464. Я використовую parseInt (hashString.replace ('#', ''), 16); де hashString - це формований CSS колір, як # 345464.
Влад

Ви перекладаєте свої номери як завгодно. Я сказав, що використовував числа, щоб ви могли бачити математику за ним. Але принцип той самий. 8 - половина Ф.
Рафаель

І ви завжди можете використовувати позначення rgba (255,128,0,1).
Рафаель

Actuall Я використовую елемент Canvas, і це чистий JS, без CSS. Але я отримав уявлення про те, як вирішити це за допомогою коду.
Влад

2

Ви трохи зрозуміли речі, javaScript не моделює колір як шістнадцятковий, як і система. Шістнадцяткова позначення - лише для людського читаного документа. Внутрішня система зберігає три цілих значення. Ви можете шукати та керувати ними безпосередньо.

Але давайте просто скажемо, що ви хочете маніпулювати фактичним документом замість внутрішніх систем. Тоді найкраще відкласти свої обчислення на деяку бібліотеку, яка робить це за вас. Ви бачите, що браузер може представляти кольори різними способами, тому вам потрібно буде запрограмувати всілякі випадки, такі як введення rgb та hsv. Тому я пропоную вам скористатися чимось на зразок Color.js, це позбавить вас від головного болю, оскільки вам не потрібно самостійно здійснювати змішування, затемнення, освітлення тощо.

Edity:

Якщо ви хочете зробити це самостійно, що я не рекомендую. Почніть з перетворення шістнадцяткової подання в числові трійки цілих чисел чи числа з плаваючою комою в діапазоні 0-1, це полегшує обчислення.

Тепер для легкої маніпуляції з перетворенням кольорів значень RGB в HSL або HSB це робить обчислення яскравості дрібницею (у Вікіпедії є формулювання). Тож тоді просто додайте або відніміть легкість або яскравість. Для моделювання реального світла обчислення досить просто, просто помножте світлий колір на базовий колір. При цьому для нейтрального світла його просто:

Результат = Інтенсивність * Колір

Як пояснив Рафаель, формула повторюється кольоровим каналом. Ви можете імітувати кольорове світло, роблячи це

Результат = Інтенсивність * LigtColor * Колір

Для цього найкраще перетворити в плаваючий перший, можливо, і лінійний. Це дозволяє отримати тепло або прохолодне світло у вашій місцевості, що може принести більше природного відчуття.

Альфа-змішування (шаровий колір кольору поверх інших) просто

Результат = ColorTop * альфа + ColorBottom * (1-альфа)

Остаточна редакція

Нарешті, ось якийсь код, який щось робить у напрямку того, що ви запитуєте. Причину, яку важко помітити, є те, що зараз це своєрідне абстрактне. Тут доступний живий код

введіть тут опис зображення

Зображення 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.


Чи може ця бібліотека бути самостійною?
Влад

@Впевнений, я не бачу причини, чому б ні.
joojaa

Я спробував це, він використовує деякі модулі NodeJS, але я не хочу робити важкі програми для сторонніх бібліотек. Спробую зробити власний код.
Влад

@Vlad додав код для шкіри голови
joojaa

: D вау, фантастична робота!
Влад

1

Вручну, якщо ви хочете змінити темність / яскравість кольору вручну і навіть не дивлячись на це. в шістнадцятковій або rgb дуже легко просто додати або віддати рівну кількість світла для кожного каналу.
Скажімо, у rgb у вас 132,145,167 років, ви можете додати 30 до кожного числа, щоб отримати більш легку версію того ж кольору, так що 162,175,207, і якщо ви зрозуміли, що ви зробили це лише трохи, то відніміть 2 з кожного, так 160,173,205. Те саме з шістнадцятковою, але в шістнадцятковій кількості. тому e4c3d5 є e4 c3 d5, ви можете додати 16, щоб зробити світліше f4d3e5 або відняти 16, щоб зробити темнішу версію того ж кольору d4b3c5.
Ви можете додати або субстратувати скільки завгодно, і вам стане краще вгадати правильну суму для додавання та субстракції понаднормових годин, доки ви додасте однакову суму до всіх трьох каналів (усі три номери), ви зміните лише те, як багато білого кольору ви додаєте або виймаєте з суміші.


Класно! Це було так просто і корисно для некодера!
brookdancer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.