Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript (http://www.flasher.ru/forum/forumdisplay.php?f=5)
-   -   Rgb послогам (http://www.flasher.ru/forum/showthread.php?t=54416)

opex 05.02.2004 02:33

Rgb послогам
 
проблема заключается в том что не получается разделить RGB на три шеснацетиричных числа R , G и B тоесть 0x034FC3 представить ка 0x03,0x4f,0xC3 написал две функции
1 все раотает но слишком грамовски и возврошает стринг
Код:

function decolorRGB(color) {
        colorArray = new Array("0x", "0x", "0x");
        if (color >> 20 == 0) {
                s = "0"+color.toString(16);
        } else {
                s = color.toString(16);
        }
        for (i=0; i<7; i++) {
                if (i == 0 || i == 1) {
                        colorArray[0] += s.charAt(i);
                } else if (i == 2 || i == 3) {
                        colorArray[1] += s.charAt(i);
                } else if (i == 4 || i == 5) {
                        colorArray[2] += s.charAt(i);
                }
        }
        return colorArray;
}
trace(decolorRGB(0x02F453))

2 вообще не работает хотя должно
Код:

function decolorRGB(color) {
        colorArray = new Array();
        colorArray[0] = color >> 16;// смещаем на право  на 16  тоесть получаем  последние 8 бит информации
        colorArray[1] = (color << 8) >> 16;// смешаем влево  на восемь избовляемся от последних 8 бит инфы  и смешаем на право на 16  получаем оставшиеся  8 бит тость сиредину
        colorArray[2] = (color << 16) >> 16;// смешаем  в лево на 16  избвляемся от  16  бит  и смешаем в право на  16 убирая  16 нулей  получаем последние восемь бит
        return colorArray;
}
trace(decolorRGB(0xFFFFFF));

все череп уже трешит

Nox Noctis 05.02.2004 03:50

вторая функция не работает из-за того что тип данных у нас НЕ трехбайтовый - а значит смещение влево не удалит самые большие разряды числа, которые по задумке должны были бы стереться при выходе за рамки размеров типа...
(color << 8) >> 16; // это фигня

хотя мысль была верная :)

Код:

function decolorRGB(color) {
        var colorArray = new Array();
        var rem = color;
        colorArray[0] = rem >> 16;
        rem -= colorArray[0] << 16;
        colorArray[1] = rem >> 8;
        rem -= colorArray[1] << 8;
        colorArray[2] = rem;
        return colorArray;
}
trace(decolorRGB(0xFFFFFF));

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

sergwizard 05.02.2004 05:08

Вот такая же хрень. Только легче.
Код:

function decolorRGB(col){
        colArr = [];
        colString = col.toString(16);
        R = "0x"+colString.substr(0,2);
        G = "0x"+colString.substr(2,2);
        B = "0x"+colString.substr(4,2);
        colArr.push(R,G,B)
        return colArr;
}
trace(decolorRGB(0xFFC6E0));

Только это абсолютно никому не нужно.
Странные вещи ты пытаешься сделать. А зачем? У тебя уже ЕСТЬ эти значения (R,G,B). Я понимаю, если ты хочешь сделать ползунки для изменения (setTransform) цвета объекта. И тогда ты привязывал бы положение ползунка к значениям ra, rb, ga, gb, ba, bb, aa, ab, которые выражены в Number. Вот тогда бы к этим цифрам (Number) можно было бы применить toString(16).

Nox Noctis 05.02.2004 05:18

ай шайтан :)

и правда все еще проще... акелла промахнулся :)

а нужно может быть такое преобразование, например, если надо сделать установки цвета объекта в виде выбора RGB в трех текстовых окошках в шестнадцатиричной форме.. других вариантов использования что-то не вижу..

sergwizard 05.02.2004 11:51

Цитата:

а нужно может быть такое преобразование, например, если надо сделать установки цвета объекта в виде выбора RGB в трех текстовых окошках в шестнадцатиричной форме.. других вариантов использования что-то не вижу..
А я и здесь не вижу смысла в таком преобразовании, так как в этом случае нам нужен обратный процесс: color = 0x +R+G+B. Именно сложение значений текстовых полей, но не разбиение цвета.

opex 05.02.2004 12:08

всем спосибо

Цитата:

sergwizard
А я и здесь не вижу смысла в таком преобразовании, так как в этом случае нам нужен обратный процесс: color = 0x +R+G+B. Именно сложение значений текстовых полей, но не разбиение цвета.
проблема то в том что сложив 1 2 3 ты получиш не 123 а 6 но эту проблему тоже можно решить
Код:

color = (r<<16 | g<<8 | b<<0)
а мне это вся хренотень нужна для создания скрипта затемнения цвета тут какойто чел поднял вопрос я заинтересовался зделал но там все работало хреново и ришил доделать а там то мне нужен ргб раскинутый на три переменные вот и все

Nox Noctis 05.02.2004 12:16

Цитата:

Оригинал написал(а) sergwizard
нам нужен обратный процесс
но пипетку (eyedropper tool) без преобразования из числа в три зекса сделать не получится. если хочешь видеть в окошках именно хексы... хотя заморочка получается излишняя, это да :)

sergwizard 06.02.2004 00:21

Вложений: 1
Цитата:

проблема то в том что сложив 1 2 3 ты получиш не 123 а 6 но эту проблему тоже можно решить color = (r<<16 | g<<8 | b<<0)
А я и не собирался, и тебе не советовал складывать 1 2 3. Я предлагал R+G+B. Смотри пример, - все тип-топ. Да, еще: b<<0 – это лишнее. Достаточно просто b.
Цитата:

мне это вся хренотень нужна для создания скрипта затемнения цвета
Тогда, мне кажется, ты не там ищешь решение этой задачи. Я бы рыскал в таком направлении: поверх цветной плоскости, накладывал бы черную такую же плоскость, и затем, в зависимости от угла поворота, менял ее альфу. Альфу легче рассчитать, чем цвет.
2Nox
Цитата:

но пипетку (eyedropper tool) без преобразования из числа в три зекса сделать не получится. если хочешь видеть в окошках именно хексы...
Вот здесь я не очень понимаю. Если пипетка, - то зачем нужны окошки? И наоборот… Пипетку, мне так кажется, удобнее делать не через хексы, а через Hue. Все-таки циферки – они и в Африке…. С ними легче творить вычисления.
В этом же аттачменте – есть и простенький пример пипетки.

sergwizard 06.02.2004 00:48

Opex, только что прочитал твой ответ menik(у). И твой же код. Такой подход бедноват и ущербен.
А давай попробуем в том направлении, которое я предложил.
Код:

_root.createEmptyMovieClip("muv1", 1);
with (_root.muv1) {
        lineStyle(0, 0x000000, 100);
        beginFill(0xFF00FF, 100);
        moveTo(0, 0);
        lineTo(200, 0);
        lineTo(200, 100);
        lineTo(0, 100);
        lineTo(0, 0);
        endFill();
}
// Клажем тень
_root.createEmptyMovieClip("muv2", 3);
with (_root.muv2) {
        lineStyle(0, 0x000000, 0);
        beginFill(0x000000, 30);
        moveTo(100, 0);
        lineTo(200, 0);
        lineTo(200, 100);
        lineTo(100, 100);
        lineTo(100, 0);
        endFill();
}

При таком подходе мы можем использовать ЛЮБЫЕ цвета.

opex 06.02.2004 03:13

мне ненужен быстрый результат мне кокраз и хочется разобратся как происходит вычисление ргб на затемнение вот в чем фишка такой способ как ты предложил мне в голову прешол первым но серовно спосибо лудьше бы помог не как не могу врубится в эти вычисления допустим если цвет 0x343434 то для затемнения можно просто уменьшать значение R G и B на одну велечину а вот как работать на пример с этим 0x234412 тут как то по процентно надо расчитывать но не как не врублюсь как

menik 06.02.2004 17:22

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

Но такой вариант тоже покатит не всегда и вообще интересно - решит ли кто-нибудь проблему в том ключе, как начал Орех, только до конца.

Я не решил.

opex 06.02.2004 20:37

Код:

function decolorRGB(color) {
        colorArray = new Array();
        colorArray[0] = int(color/0x10000);
        colorArray[1] = int(color/0x100)-colorArray[0]*0x100;
        colorArray[2] = color-int(color/0x100)*0x100;
        return colorArray;
}
trace(temneeRGB(0xffffff));

я зделал чтобы разделяло не бес помощи правдо а истина была так блиско щас затемнение уже дописываю

sergwizard 07.02.2004 01:31

Цитата:

function decolorRGB(color) {
colorArray = new Array();
colorArray[0] = int(color/0x10000);
colorArray[1] = int(color/0x100)-colorArray[0]*0x100;
colorArray[2] = color-int(color/0x100)*0x100;
return colorArray;
}
trace(temneeRGB(0xffffff));

В огороде бузина, в Киеве дядька. Круто!!!!:D

opex 07.02.2004 01:46

ты прочто нажми лудьше сюда

sergwizard 07.02.2004 03:41

А раньше ты мне полным дебилом не казался.... Видно, ошибался. :p

opex 07.02.2004 03:49

М просто не очень понял твое выражение В огороде бузина, в Киеве дядька. Круто

nuran 07.02.2004 12:29

Цитата:

Оригинал написал(а) opex
color = (r<<16 | g<<8 | b<<0)
[/code]

Точно точно.

sergwizard 07.02.2004 12:34

А что тут понимать? Ты пишешь функцию decolorRGB(color), а для проверки пишешь trace(temneeRGB(0xffffff));
Вот это и есть "В огороде бузина...."

nuran 07.02.2004 12:35

И вообще, если тебе нужно программное изменение цвета, позырь и утащи у Поля его скрипт
http://www.neave.com/lab/neave_site_fla.zip
http://www.neave.com


Часовой пояс GMT +4, время: 14:43.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.