Как программно изменить шестнадцатеричные цвета, чтобы они стали светлее или темнее? - PullRequest
1 голос
/ 13 июля 2010

Мне нужен базовый цвет, скажем, 0x0066FF, и я хочу, чтобы каждая итерация после этого становилась, например, немного темнее.

Ответы [ 3 ]

3 голосов
/ 13 июля 2010

За исключением того, что ваш входной цвет имеет некоторый оттенок серого, RGB не собирается его сокращать. RGB полезен для хранения пиксельных данных, но ужасно манипулировать «визуально» осмысленным способом.

Некоторое время назад я написал аналогичный ответ в списке флеш-кодеров на эту тему, поэтому ниже приводится более или менее дословная копия и вставка этого ответа. Я надеюсь, что вы найдете это полезным.

Точным способом изменения оттенка основного цвета является преобразование значения RGB в цветовое пространство HSL , затем настройка яркости (яркости) и преобразование обратно в RGB. Вот удобный класс для преобразования RGB <-> HLS.

http://www.dreaminginflash.com/2007/11/19/hls-to-rgb-rgb-to-hls/

Вот некоторый тестовый код:

import ColorUtils;
var rgb:Number = 0x336699;
var hls:Object = ColorUtils.RGBtoHLS(rgb);
var darkL:Number  = Math.max(hls.l - 0.2,0);
var lightL:Number  = Math.min(hls.l + 0.2,1);
var dark:Number = ColorUtils.HLStoRGB(hls.h,darkL,hls.s);
var light:Number = ColorUtils.HLStoRGB(hls.h,lightL,hls.s);
var origBmd:BitmapData   = new BitmapData(40,40,false,rgb);
var darkerBmd:BitmapData = new BitmapData(40,40,false,dark);
var lighterBmd:BitmapData = new BitmapData(40,40,false,light);
var origBm:Bitmap = new Bitmap(origBmd);
var darkerBm:Bitmap = new Bitmap(darkerBmd);
var lighterBm:Bitmap = new Bitmap(lighterBmd);

darkerBm.y  = 0;
origBm.y  = 50;
lighterBm.y = 100;

addChild(origBm);
addChild(darkerBm);
addChild(lighterBm);
2 голосов
/ 13 июля 2010

0x000000 черный, поэтому все, что ближе к черному, темнее (или, в любом случае, серее).Поэтому, если вы разделите разницу в каждом байте между собой и 0x00, это быстро потемнеет.

0x00 / 2 = 0x00
0x66 / 2 = 0x33
0xff / 2 = 0x80

--> 0x0033ff

Вы можете разделить ее на 10 и повторить удаление 1/10, если вы хотите, например, 10 оттенков.

Обновление:

Я писал это недавно:

    /**
     * Create new color blended into another.
     * @param color to blend
     * @param into other color
     * @param factor amount of original color to keep, i.e. 0 would be no "color", all "into"
     * @param blendAlpha uses the 0xFF000000 part of the color as well
             * @returns blended color uint
     */
    public static function blendColor( color:uint, into:uint=0xFFFFFFFF, factor:Number=0.5, blendAlpha:Boolean=false ) : uint
    {
        if( factor < 0 || factor > 1 ) factor = 0.5;
        var a1:uint = ( color >> 24 ) & 0xFF;
        var r1:uint = ( color >> 16 ) & 0xFF;
        var g1:uint = ( color >>  8 ) & 0xFF;
        var b1:uint = ( color >>  0 ) & 0xFF;
        var a2:uint = (  into >> 24 ) & 0xFF;
        var r2:uint = (  into >> 16 ) & 0xFF;
        var g2:uint = (  into >>  8 ) & 0xFF;
        var b2:uint = (  into >>  0 ) & 0xFF;
        var a3:uint = ( a1*factor + a2*(1-factor) ) & 0xFF;
        var r3:uint = ( r1*factor + r2*(1-factor) ) & 0xFF;
        var g3:uint = ( g1*factor + g2*(1-factor) ) & 0xFF;
        var b3:uint = ( b1*factor + b2*(1-factor) ) & 0xFF;
        return ( blendAlpha?a3<<24:0x0 ) | (r3<<16) | (g3<<8) | b3;
    }
1 голос
/ 13 июля 2010

0x00 00 00 - КРАСНО-ЗЕЛЕНЫЙ СИНИЙ. Значение 0xFF0000 - чистый красный, 0x00FF00 - чистый зеленый, 0x0000FF - чистый синий. Поэтому, если вы хотите стать темнее, уменьшите шестнадцатеричные значения, начиная с 0xFF. Если вы хотите масштабировать темноту от 0x0066FF, вам нужно убедиться, что вы поддерживаете такое же соотношение RGB. Значение 0xFF00FF -> 0xCC00CC -> 0x990099 -> 0x660066 -> 0x330033 -> 0x000000.

Простите за частичный ответ, но, надеюсь, этого достаточно, чтобы вы самостоятельно выяснили более конкретные детали реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...