Добавление прозрачности цвета.

Tema05

Известный
Автор темы
1,442
401
Версия MoonLoader
.026-beta
Рисую объекты рендером и есть необходимость изменить их прозрачность с помощью переменной.

Цвет например 12232E. Переменная имеет значение от 0 до 255 (0xFF). Как мне добавить значение переменной перед цветом?
 
Решение
В общем я наверное тогда давно не понял в чём проблема а сейчас понял. Дело в том что значение alpha могло быть дробным что вызывало проблему в решении выше.

Для тех у кого такая же проблема вот 2 решения:

Lua:
math.floor(alpha) * 0x1000000 + color)
bit.bor(color, bit.lshift(alpha, 24))

--color это цвет в формате 0xRRGGBB
--alpha это значение в диапазоне от 0 до 255

CaJlaT

Овощ
Модератор
2,805
2,607
Функцию взял из кейлоггера космо

Lua:
function color_alpha(color, alpha)
    local r = bit.band(bit.rshift(color, 16), 0xFF)
    local g = bit.band(bit.rshift(color, 8), 0xFF)
    local argb = bit.band(color, 0xFF)
    argb = bit.bor(argb, bit.lshift(g, 8))
    argb = bit.bor(argb, bit.lshift(r, 16))
    argb = bit.bor(argb, bit.lshift(alpha, 24))
    return argb
end
--Пример: color = color_alpha(0xFF993066, 255)
 

kin4stat

mq-team
Всефорумный модератор
2,730
4,710
Функцию взял из кейлоггера космо

Lua:
function color_alpha(color, alpha)
    local r = bit.band(bit.rshift(color, 16), 0xFF)
    local g = bit.band(bit.rshift(color, 8), 0xFF)
    local argb = bit.band(color, 0xFF)
    argb = bit.bor(argb, bit.lshift(g, 8))
    argb = bit.bor(argb, bit.lshift(r, 16))
    argb = bit.bor(argb, bit.lshift(alpha, 24))
    return argb
end
--Пример: color = color_alpha(0xFF993066, 255)
Ладно.
Lua:
function join_alpha_color_argb(color, alpha)
    return bit.bor(color, bit.lshift(alpha, 24))
end

function join_alpha_color_rgba(color, alpha)
    return bit.bor(bit.lshift(color, 8), alpha)
end
 
  • Вау
Реакции: MrBidloKoder

Tema05

Известный
Автор темы
1,442
401
Ладно.
Lua:
function join_alpha_color_argb(color, alpha)
    return bit.bor(color, bit.lshift(alpha, 24))
end

function join_alpha_color_rgba(color, alpha)
    return bit.bor(bit.lshift(color, 8), alpha)
end
Должно вывозить одинаковое но нет.
Lua:
print(0xFF12232E)
print(bit.bor(bit.lshift(0x12232E, 8), 255))
 

Tema05

Известный
Автор темы
1,442
401
Функцию взял из кейлоггера космо

Lua:
function color_alpha(color, alpha)
    local r = bit.band(bit.rshift(color, 16), 0xFF)
    local g = bit.band(bit.rshift(color, 8), 0xFF)
    local argb = bit.band(color, 0xFF)
    argb = bit.bor(argb, bit.lshift(g, 8))
    argb = bit.bor(argb, bit.lshift(r, 16))
    argb = bit.bor(argb, bit.lshift(alpha, 24))
    return argb
end
--Пример: color = color_alpha(0xFF993066, 255)
Также выводы не сходятся.
Lua:
function color_alpha(color, alpha)
    local r = bit.band(bit.rshift(color, 16), 0xFF)
    local g = bit.band(bit.rshift(color, 8), 0xFF)
    local argb = bit.band(color, 0xFF)
    argb = bit.bor(argb, bit.lshift(g, 8))
    argb = bit.bor(argb, bit.lshift(r, 16))
    argb = bit.bor(argb, bit.lshift(alpha, 24))
    return argb
end
print(0xFF12232E)
print(color_alpha(0x12232E, 255))
 

Tema05

Известный
Автор темы
1,442
401
Решил на основе этого сам попробовать что-то и не понял почему в 3 случая значения разные.
Lua:
print(bit.lshift(0xFF, 8))-- 65280
print(0xFF00)-- 65280
print('----------')
print(bit.lshift(0xFF, 16))-- 16711680
print(0xFF0000)-- 16711680
print('----------')
print(bit.lshift(0xFF, 24))-- -16777216
print(0xFF000000)-- 4278190080
 

Vintik

Мечтатель
Проверенный
1,469
918
Рисую объекты рендером и есть необходимость изменить их прозрачность с помощью переменной.

Цвет например 12232E. Переменная имеет значение от 0 до 255 (0xFF). Как мне добавить значение переменной перед цветом?
Чё за ерунду выше пишут
Lua:
new_color = alpha * 0x1000000 + color

-- пример:
new_color = 0xFF * 0x1000000 + 0x12232E
print(new_color) -- выведет: 0xFF12232E
 

Tema05

Известный
Автор темы
1,442
401
Чё за ерунду выше пишут
Lua:
new_color = alpha * 0x1000000 + color

-- пример:
new_color = 0xFF * 0x1000000 + 0x12232E
print(new_color) -- выведет: 0xFF12232E
Щас вспомню почему это не вариант. Я собственно изначально так и делал
 

Tema05

Известный
Автор темы
1,442
401
В общем я наверное тогда давно не понял в чём проблема а сейчас понял. Дело в том что значение alpha могло быть дробным что вызывало проблему в решении выше.

Для тех у кого такая же проблема вот 2 решения:

Lua:
math.floor(alpha) * 0x1000000 + color)
bit.bor(color, bit.lshift(alpha, 24))

--color это цвет в формате 0xRRGGBB
--alpha это значение в диапазоне от 0 до 255