Zum Inhalt springen

Modul:Benutzer:Mps/HSV

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 16. März 2013 um 12:54 Uhr durch Mps (Diskussion | Beiträge) (AZ: Die Seite wurde neu angelegt: local p = {} function rgb2hsv(r, g, b) local max = math.max(r, g, b) local min = math.min(r, …). Sie kann sich erheblich von der aktuellen Version unterscheiden.
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Die Dokumentation für dieses Modul kann unter Modul:Benutzer:Mps/HSV/Doku erstellt werden

local p = {}

function rgb2hsv(r, g, b)
    local max = math.max(r, g, b)
    local min = math.min(r, g, b)
    local c = max - min
    
    -- calculate hue
    local h
    if c == 0 then
        h = 0
    elseif max == r then
        h = 60 * (0 + ((g - b)/c))
    elseif max == g then
        h = 60 * (2 + ((g - b)/c))
    elseif max == b then
        h = 60 * (4 + ((g - b)/c))
    end
    if h < 0 then h = h + 360 end
    
    -- calculate value
    local v = max
    
    -- calculate luminance
    -- local l = (max + min) / 2
    
    -- calculate saturation
    local s
    if c == 0 then
        s = 0
    else
        s = c/v
    end
    
    return h, s, v
end

function hsv2rgb(h, s, v)
    local hi = math.floor(h / 60)
    local f = ((h / 60) - hi)
    
    local p = v * (1 - s)
    local q = v * (1 - s * f)
    local t = v * (1 - s * (1 - f))
    
    if hi == 1 then
        return q, v, p
    elseif hi == 2 then
        return p, v, t
    elseif hi == 3 then
        return p, q, v
    elseif hi == 4 then
        return t, p, v
    elseif hi == 5 then
        return v, p, q
    else
        return v, t, p
    end
end

--[[
toHSV

Description: Converts a RGB color to a HSV color.

Usage: {{#invoke:HSV|toHSV|R|G|B}}

Output: hue [0°..360°], saturation [0..1], value [0..1]
]]
function p.toHSV(frame)
    return rgb2hsv(frame.args[1] / 255, frame.args[2] / 255, frame.args[3] / 255)
end

--[[
toHSV

Description: Returns the hue of a RGB color.

Usage: {{#invoke:HSV|hue|R|G|B}}

Output: hue [0°..360°]
]]
function p.hue(frame)
    local h, s, v = rgb2hsv(frame.args[1] / 255, frame.args[2] / 255, frame.args[3] / 255)
    return h
end

--[[
toHSV

Description: Returns the saturation of a RGB color.

Usage: {{#invoke:HSV|saturation|R|G|B}}

Output: saturation [0..1]
]]
function p.saturation(frame)
    local h, s, v = rgb2hsv(frame.args[1] / 255, frame.args[2] / 255, frame.args[3] / 255)
    return s
end

--[[
toHSV

Description: Returns the saturation of a RGB color.

Usage: {{#invoke:HSV|saturation|R|G|B}}

Output: saturation [0..1]
]]
function p.saturate(frame)
    local h, s, v = rgb2hsv(frame.args[1] / 255, frame.args[2] / 255, frame.args[3] / 255)
    return s
end

--[[
toHSV

Description: Returns the hue of a RGB color.

Usage: {{#invoke:HSV|value|R|G|B}}

Output: value [0..1]
]]
function p.value(frame)
    local h, s, v = rgb2hsv(frame.args[1] / 255, frame.args[2] / 255, frame.args[3] / 255)
    return v
end

--[[
toHSV

Description: Saturates a RGB color by a given factor.

Usage: {{#invoke:HSV|saturate|R|G|B|factor}}

Output: saturated RGB
]]
function p.saturate(frame)
    -- convert to HSV
    local h, s, v = rgb2hsv(frame.args[1] / 255, frame.args[2] / 255, frame.args[3] / 255)
    -- saturate
    s = s * frame.args[4]
    if s < 0 then
        s = 0
    elseif s > 1 then
        s = 1
    end
    -- convert back to RGB
    local r, g, b = hsv2rgb(h, s, v)
    return math.floor(r * 255 + 0.5), math.floor(g * 255 + 0.5), math.floor(b * 255 + 0.5)
end

--[[
toHSV

Description: Converts a HSV color to a RGB color.

Usage: {{#invoke:HSV|toRGB|H|S|V}} with H in [0°..360°], S in [0..1] and V in [0..1]

Output: R, G, B
]]
function p.toRGB(frame)
    local r, g, b = hsv2rgb(frame.args[1], frame.args[2], frame.args[3])
    -- transform from real [0..1] to integer [0..255]
    return math.floor(r * 255 + 0.5), math.floor(g * 255 + 0.5), math.floor(b * 255 + 0.5)
end

return p